VirtualBox에서 Linux 환경을 구성하고 MySQL을 설치했다. 로컬 PC의 Windows 환경에서 JDBC 연결이 잘 되지 않아 헤맨 내용을 바탕으로 해결한 내용을 포스팅한다.
현재 DBeaver에는 root 계정과 user01 계정이 있다.
alter user 'root'@'localhost' identified with mysql_native_password
flush privileges;
grant all privileges on . to 'root'@'localhost' with grant option
use mysql;
select user,host from user;
결국에는 위의 내용과 같이 권한을 주어서 해결하는 것 같은데 root는 연결 성공하고 user01은 되지 않는 문제점이 발생했다.
해결 방법
1. MySQL 접속 설정 변경하기
해당하는 데이터베이스 우클릭 > Edit Connection > Driver Properties 탭 > allowPublicKeyRetrieval 항목을
false에서 true로 변경해주어야 한다.
2. bind-address 변경
리눅스 명령어를 사용하여 MySQL 관련 파일을 수정한다.
아래의 명령어와 같이 mysqld.cnf 파일을 열어 수정해주었다.
username@servername:~$ ls /etc/
username@servername:~$ ls /etc/m # m누르고 tab 누르면 m으로 시작하는 것만 보여줌.
machine-id manpath.config mime.types modules multipath/
magic mdadm/ mke2fs.conf modules-load.d/ multipath.conf
magic.mime mecabrc modprobe.d/ mtab mysql/
username@servername:~$ ls /etc/m
username@servername:~$ ls /etc/mysql/mysql.conf.d/
mysql.cnf mysqld.cnf
username@servername:~$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf # 꼭 sudo로 들어가기
[sudo] password for username:
Ubuntu 접속 URL 설정으로 MySQL 통신을 위한 작업을 한다.
(파일을 외부에서 접속 가능하게 ip를 오픈하기 위해 0.0.0.0 값으로 변경한다.)
bind-address = 127.0.0.1 을 0.0.0.0으로 수정한다.
리눅스 명령어 참고)
1. vi 명령어로 파일 진입 시 i 를 눌러 insert 모드로 전환한다.
2. 127.0.0.1을 0.0.0.0 으로 수정한 후
3. esc 키를 누른 후 :wq! (저장하고 종료)를 입력하여 편집기를 빠져나온다.
3. mysql 재시작
username@servername:~$ sudo service mysql restart
username@servername:~$ sudo systemctl status mysql
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2023-12-13 00:57:24 UTC; 19s ago
Process: 20094 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID: 20102 (mysqld)
Status: "Server is operational"
Tasks: 38 (limit: 4559)
Memory: 369.4M
CPU: 1.179s
CGroup: /system.slice/mysql.service
└─20102 /usr/sbin/mysqld
Dec 13 00:57:24 servername systemd[1]: mysql.service: Deactivated successfully.
Dec 13 00:57:24 servername systemd[1]: Stopped MySQL Community Server.
Dec 13 00:57:24 servername systemd[1]: mysql.service: Consumed 7min 48.989s CPU time.
Dec 13 00:57:24 servername systemd[1]: Starting MySQL Community Server...
Dec 13 00:57:24 servername systemd[1]: Started MySQL Community Server.
username@servername:~$
4. 이클립스 코드
package step01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBC1Basic {
// MySQL
public static void main(String[] args) {
// driver 로딩
try {
Class.forName("com.mysql.cj.jdbc.Driver"); // vendor specific
// 접속
Connection con = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:8777/fisa?useSSL=false&allowPublicKeyRetrieval=true", "user01", "user01");
System.out.println(con);
// sql 문장 실행 객체 생성
Statement stmt = con.createStatement();
// 검색 결과는 결과 집합 구조의 table 형식 - result set이라고 표현
ResultSet rs = stmt.executeQuery("select * from dept");
// 결과 활용
while (rs.next()) {
System.out.println(rs.getInt(1) + " " + rs.getString("dname"));
}
// 자원 반환(접속 해제)
/*
* ResultSet -> Statement -> Connection 순으로 자원 반환
*/
rs.close();
stmt.close();
con.close();
} catch (Exception e) { // 발생되는 모든 예외 상위 타입으로 처리 선언
e.printStackTrace();
}
}
}
getConnection의 parameter로 jdbc api로 직접 접속 제어할 때 통신 규약을 준다.
- 127.0.0.1:8777/fisa : mysql vendor가 지정할 설정값
- ?useSSL=false&allowPublicKeyRetrieval=true: db 버전 등에 따른 설정
"jdbc:mysql://127.0.0.1:8777/fisa?useSSL=false&allowPublicKeyRetrieval=true", "[id]", "[pw]"
참고로 포트 포워딩은 VirtualBox에서 다음과 같이 설정해주었다.
Windows : application으로 접속(고유 ip)
Linux : MySQL(고유 ip)
- private network : 외부 access 시에 vb의 nat으로 private ip : public ip 매핑
- Windows에서 127.0.0.1:8777 접속 시도 시
*MySQL은 3306 기본 port 제공
'Infra' 카테고리의 다른 글
[AWS] CloudWatch, S3를 활용한 실습 (0) | 2024.02.28 |
---|---|
[AWS] DynamoDB 테이블 생성 및 데이터 조회 (0) | 2024.02.26 |
[AWS EC2] Docker로 Jenkins 설치 및 GitHub Webhook 설정 (0) | 2024.02.21 |
[Trouble Shooting] Windows와 Linux의 파일 권한 차이 (0) | 2024.02.20 |
[Docker] 리눅스 환경에서 컨테이너 관리하고 실행하기 (1) | 2024.02.16 |