외부 애플리케이션 연결
애플리케이션 및 드라이버는 연결 문자열을 사용하여 IBM Cloud® Databases for MySQL에 연결합니다. 서비스는 드라이버 및 애플리케이션용으로 특별히 연결 문자열을 제공합니다. 연결 문자열은 배포 개요 의 엔드포인트 패널에 표시되며 Cloud Databases CLI 플러그인 과 Cloud Databases API 에서 검색할 수도 있습니다.
연결 문자열은 배치 시 작성한 인증 정보에서 사용할 수 있습니다. 모든 연결 및 애플리케이션에 대해 관리 사용자를 사용할 수 있지만 애플리케이션을 연결하기 위해 특별히 사용자를 작성하는 것이 좋습니다. 인증 정보 생성에 대한 문서는 사용자 작성 및 연결 문자열 가져오기 페이지에 있습니다.
언어의 드라이버를 사용하여 연결
드라이버가 배치에 연결해야 하는 모든 정보는 연결 문자열의 "mysql" 섹션에 있습니다. 이 표에는 참조에 대한 분석이 포함되어 있습니다.
| 필드 이름 | 색인 | 설명 |
|---|---|---|
Type |
연결 유형 - MySQL, 의 경우 "URI"입니다. | |
Scheme |
URI의 스키마 - MySQL, 의 경우 "mysql"입니다. | |
Path |
URI 경로 - MySQL의 경우 데이터베이스 이름입니다. 기본값은 ibmclouddb입니다. |
|
Authentication |
Username |
연결하는 데 사용하는 사용자 이름입니다. |
Authentication |
Password |
사용자의 비밀번호 - $PASSWORD 로 표시될 수 있습니다. |
Authentication |
Method |
인증이 수행되는 방법이며 "직접" 인증은 드라이버에 의해 처리됩니다. |
Hosts |
0... |
연결할 호스트 이름 및 포트입니다. |
Composed |
0... |
스키마, 인증, 호스트 및 경로를 결합한 URI입니다. |
Certificate |
Name |
데이터베이스 배포를 위한 서비스 전용 인증서에 할당된 이름입니다. |
Certificate |
Base64 | base64 인코딩된 인증서 버전입니다. |
0...는 배열에서 이러한 항목 중 하나 이상을 표시합니다.
많은 MySQL 드라이버가 연결 정보의 "구성됨" 필드에서 URI 형식 연결 문자열이 제공되면 배치에 연결할 수 있습니다. 예를 들면 다음과 같습니다
mysql://ibm_cloud_30399dec_4835_4967_a23d_30587a08d9a8:$PASSWORD@981ac415-5a35-4ac7-b6bb-fb609326dc42.8f7bfd8f3faa4218aec56e069eb46187.databases.appdomain.cloud:32704/ibmclouddb?ssl-mode=verify-full
ssl-mode 상태에 대한 자세한 정보는 추가 연결 매개변수를 참조하십시오.
다음 예에서는 연결 문자열 및 Java 드라이버 jdbc의 정보를 사용하여 데이터베이스에 연결합니다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class App {
private final String STATUS_COMMAND = "SHOW VARIABLES LIKE '%version%';";
private Connection connect = null;
private Statement stmt = null;
private ResultSet rs = null;
private final String url = "mysql://127.0.0.1:30799";
private final String username = "";
private final String password = "";
private final Boolean useSSL = true;
public static void main(String args[]) throws Exception {
App app = new App();
final byte maxConnectionAttempt = 5;
byte currentConnectionAttempt = 0;
while (!app.connectDatabase() && currentConnectionAttempt < maxConnectionAttempt)
++currentConnectionAttempt;
if (currentConnectionAttempt >= maxConnectionAttempt) {
System.out.println(currentConnectionAttempt + " weren't successfull!");
} else {
app.printStatus();
app.closeConnection();
}
}
public void printStatus() {
try {
stmt = connect.createStatement();
rs = stmt.executeQuery(STATUS_COMMAND);
while (rs.next())
System.out.println(rs.getString(1) + ": " + rs.getString(2));
} catch (SQLException ex) {
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
closeConnection();
}
}
private void closeConnection() {
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (connect != null) {
connect.close();
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
System.out.println("Connection closed.");
}
public boolean connectDatabase() {
// https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-usagenotes-connect-drivermanager.html
try {
Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
props.setProperty("useSSL", Boolean.toString(useSSL));
props.setProperty("sslMode", (useSSL ? "REQUIRED" : "DISABLED"));
props.setProperty("requireSSL", Boolean.toString(useSSL));
props.setProperty("verifyServerCertificate", Boolean.toString(useSSL));
Class.forName("com.mysql.cj.jdbc.Driver");
connect = DriverManager.getConnection("jdbc:" + url, props);
return true;
} catch (SQLException ex) {
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
} catch (ClassNotFoundException ex) {
System.out.println("Connector class can not be found: " + ex.getMessage());
}
return false;
}
}
다음 예제에서는 연결 문자열 및 Python 드라이버 pymysql의 정보를 사용하여 데이터베이스에 연결합니다. 이것은 오류 처리 또는 재시도 논리가 없는 단순한 연결 예제이며 프로덕션에 적합하지 않을 수 있습니다.
import pymysql
connection = pymysql.connect(
host="hostname",
port=32089,
user="username",
passwd="password",
ssl_ca="/home/user/mysql_ca.crt",
ssl_verify_cert=True,
ssl_verify_identity=True)
cursor = connection.cursor()
cursor.execute("SHOW STATUS;")
for row in cursor:
print(row[0] + "\t" + row[1])
cursor.close()
connection.close()
드라이버 TLS 및 서비스 전용 인증서 지원
Databases for MySQL에 대한 모든 연결은 TLS 1.2이 가능하므로, 연결하기 위해 사용하는 드라이버는 암호화를 지원할 수 있어야 합니다. 또한 배포에는 서비스 전용 인증서가 함께 제공되므로 드라이버가 연결 시 서버를 확인할 수 있습니다.
자세한 정보는 Cloud Databases 인증서 FAQ를 참조하십시오.
서비스 전용 인증서 사용
- 엔드포인트 패널 또는 연결 정보의 Base64 필드에서 인증서 정보를 복사하십시오.
- 필요하면, Base64 문자열을 텍스트로 디코딩하십시오.
- 파일에 인증서를 저장하십시오. (제공된 이름 또는 자체 파일 이름을 사용할 수 있습니다.)
- 드라이버 또는 클라이언트에 인증서의 경로를 제공하십시오.
서비스 전용 인증서를 위한 CLI 플러그인 지원
ibmcloud cdb deployment-cacert "your-service-name" 명령으로 CLI 플러그인을 사용하여 배치에 대해 디코딩된 인증서를 표시할 수 있습니다. base64를 텍스트로 디코딩합니다. 명령의 출력을 복사하여 파일에 저장하고 드라이버에 대한 파일 경로를 제공하십시오.
기타 드라이버
MySQL에는 언어 드라이버의 배열이 있습니다. 아래 표에는 가장 일반적인 내용이 포함되어 있습니다. 자세한 정보는 MySQL의 커넥터와 API를 참조하십시오.
| 언어 | 드라이버 | 예제 |
|---|---|---|
| PHP | mysql |
트랜잭션에 대한 API 지원 |
| Ruby | ruby-mysql |
Ruby/MySQL API |
| C# | ODBC |
LiMySQL ODBC 개발자 가이드 |
| Go | mysql |
Go-MySQL-Driver |
PHP를 사용하여 MySQL 에 연결할 때 인증 플러그인을 sha256_password 에서 mysql_native_password 로 변경해야 합니다.