PHP의 PDO(PHP Data Objects) 기능을 사용하여 데이터베이스를 사용하고자 할 때 주로 다음과 같은 PHP 코드를 사용합니다.
try { $db_conn = new PDO("mysql:host=localhost;dbname=mydatabase;charset=utf8", "username", "password"); } catch (PDOException $e) { echo "데이터베이스 연결 에러! : " . $e; }
그런데 다음과 같이 PDOException
에러가 발생하며 데이터베이스 서버에 접속되지 않는 경우가 있습니다.
PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]
이는 웹 서버에서 접속을 요청한 데이터베이스 서버에서 MySQL Server 8.0 버전 이상을 사용할 때에 나타나는 문제입니다. MySQL Server 5.7 버전을 사용하다가 업그레이드 된 MySQL을 설치하게되면서 예전에는 없었던 문제가 나온 것이기도 합니다. php의 데이터베이스를 연결하는 함수에서 MySQL 8.0의 최신 인증 기술인 caching_sha2 인증을 지원하지 않아서 발생하는 것입니다.
이 문제를 해결하려면 php가 MySQL Server 8.0을 제대로 지원해주는 방안이 나올 때 까지 MySQL Server를 5.7 이하 버전으로 유지하는 것이 좋을 듯 싶습니다.
만약 그래도 MySQL Server 8.0을 계속 사용해야 한다면, 현재 데이터베이스 서버에서 사용 중인 사용자 인증 기능을 기존의 인증 방식(MySQL Native Password Authentication)으로 바꾸는 방법이 있습니다. (이 방법은 PHP 공식 문서인 다음 경로에서도 설명되어 있습니다 : https://www.php.net/manual/en/ref.pdo-mysql.php)
먼저 MySQL Server의 주요 설정 파일인 my.cnf
을 열어줍니다. 리눅스 기준 /etc/my.cnf
파일을 텍스트 에디터를 사용하여 열어주면 됩니다.
이후 [mysqld]
항목을 찾습니다. 여기의 아랫 부분에 다음과 같은 옵션값을 넣어줍니다.
default_authentication_plugin= mysql_native_password
수정하면 다음과 같을 것입니다.
완료되었다면 파일을 저장하고 빠져나와줍니다.
다음으로 해야 할 것은 현재 사용 중인 사용자 계정의 암호를 모두 바꾸어 주는 것입니다. 관리자 계정을 포함하여 직접 생성한 모든 계정을 미리 찾아둡니다.
먼저 root 계정의 암호를 변경해보도록 하겠습니다. 리눅스에서는 콘솔 환경에서, 윈도우 기준 cmd
에서 명령어를 입력하여 mysql 데이터베이스에 접속합니다.
mysql -uroot -p Enter password: <root 계정의 암호 입력>
이후 다음 쿼리문을 실행합니다. 여기서 주의할 점은 기존에 유저를 생성할 때 입력한 쿼리인 IDENTIFIED BY
가 아닌 IDENTIFIED WITH mysql_native_password
로 입력해주어야 합니다.
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '[변경할 암호]'; ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '[변경할 암호]';
그 다음으로, 별도로 생성한 일반 사용자가 있다면 해당 사용자에 대한 계정도 아래와 같이 변경해줍니다.
ALTER USER '[사용자명]'@'%' IDENTIFIED WITH mysql_native_password BY '[변경할 암호]';
만약 이후에 사용자를 생성하게 될 경우에는 다음과 같이 IDENTIFIED WITH mysql_native_password BY
를 사용해주면 됩니다. 그렇지만 위에서 설정했듯이 기본 값으로 이미 mysql native password를 사용하기 때문에 기존 방식대로 사용자를 생성해도 무방합니다.
암호 변경이 완료되었다면 잠시 데이터베이스 서버의 연결을 끊어주겠습니다. (exit
입력)
이제 MySQL Server의 서비스를 다시 시작해주어야 합니다. 리눅스를 기준으로 다음 명령어로 서비스를 다시 시작해줍니다. (프로그램 및 운영체제에 따라 서비스 이름이 mysqld
이거나 mysql
일 수 있습니다. 이 방법을 모른다면 호스팅 및 서버 관리자에게 문의해보셔야 합니다.)
만약 systemd
를 사용 중이라면 다음과 같이도 사용 가능합니다.
[root@localhost ~]# systemctl restart mysqld.service
MySQL 서버가 재시작되었다면, 다시 한 번 PHP PDO의 접속 코드가 사용 된 페이지에 접속하고 문제가 발생하는지 확인해보세요.
별다른 문제가 없다면 에러 메세지가 사라지고 문제 없이 서버에 연결 되어 있을 것입니다.
Xcode에서 iOS 애플리케이션을 빌드(Archive)하고 App Store Connect에 앱을 업로드하는 도중, 아래와 같은 에러가 발생하면서 더…
INSTALL_FAILED_INSUFFICIENT_STORAGE 문제 안드로이드 스튜디오에서 에뮬레이터를 실행하고 개발중인 애플리케이션을 실행하려 하면 로그 창에 아래와 같이 표시되면서…
리눅스 명령어 - kill, killall 리눅스 kill 명령어는 특정 프로세스를 종료해주는 명령어입니다. 백그라운드에서 실행되고 있는…
JavaScript는 역사가 긴 스크립트 프로그래밍 언어입니다. 세월이 흐르면서 많은 자바스크립트 표준이 만들어졌고, 현재는 많은 문법적…
NodeJS 테스트 프레임워크인 Mocha는 비동기 테스트를 지원합니다. 간혹 특정 테스트 스크립트를 작성하고 실행하면 아래와 같이…
View Comments
감사합니다
도움되어서 다행이네요!
고맙습니다