명령줄은 제대로 작동하지만 PHP를 통한 MySQL 연결이 실패합니다.

dba.stackexchange https://dba.stackexchange.com/questions/115687

  •  29-09-2020
  •  | 
  •  

문제

MySQL 5.7을 설치하고 테스트를 실행하는 스크립트가 있습니다. 트래비스 CI (우분투 12 실행).

스크립트에는 비밀번호 없이 비대화형 모드로 MySQL을 설치하기 위한 다음 줄이 포함되어 있습니다.

add-apt-repository 'deb http://repo.mysql.com/apt/ubuntu/ precise mysql-5.7-dmr'
apt-get update

echo mysql-community-server mysql-community-server/root-pass password "" | debconf-set-selections
echo mysql-community-server mysql-community-server/re-root-pass password "" | debconf-set-selections

DEBIAN_FRONTEND=noninteractive apt-get -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold -q -y install mysql-server libmysqlclient-dev

설치가 원활하게 진행되며 mysql 명령줄 유틸리티를 사용하면 비밀번호 없이 서버에 연결할 수 있습니다.

mysql --user=root -e "SELECT VERSION();"
+-----------+
| VERSION() |
+-----------+
| 5.7.8-rc  |
+-----------+

이제 PHP를 사용하여 연결을 시도하면 PDO:

new PDO('mysql:host=localhost', 'root', '');

다음 오류가 발생합니다.

SQLSTATE[HY000] [1045] 사용자 'root'@'localhost'에 대한 액세스가 거부되었습니다(비밀번호 사용:아니요)

허락하려고 했는데 root 모든 호스트에서 연결하려면 다음을 수행하세요.

GRANT ALL ON *.* to root@'%' IDENTIFIED BY '';
FLUSH PRIVILEGES;

성공없이.

무엇이 문제가 될 수 있나요?

도움이 되었습니까?

해결책

MySQL 매뉴얼에서 답을 찾았습니다. 플러그형 인증:

MySQL 5.5.7부터 서버는 플러그인을 사용하여 클라이언트를 인증합니다.mysql.user 테이블에서 적절한 계정 행을 선택하는 것은 이전과 마찬가지로 사용자 이름과 클라이언트 호스트를 기반으로 하지만 서버는 클라이언트에 어떤 인증 플러그인을 적용할지 계정 행에서 결정하여 클라이언트를 인증합니다.

MySQL 패키지는 root 을 사용하는 사용자 auth_socket 인증 플러그인이므로 소켓을 통한 연결만 허용되며 Linux 계정의 사용자 이름도 확인됩니다.

그만큼 mysql 명령은 기본적으로 소켓을 사용하고 다음과 같이 실행됩니다. root 내 스크립트에서는 연결이 허용되었습니다.

PHP 매뉴얼에 따르면, PDO MySQL 연결 localhost 또한 소켓을 사용합니다.그러나 PHP는 권한이 없는 사용자로 실행되므로 연결이 거부됩니다. auth_socket 플러그인.

다음 줄을 추가하여 스크립트를 수정했습니다.

mysql --user=root -e \
"UPDATE mysql.user SET plugin='mysql_native_password'; FLUSH PRIVILEGES";

이제 잘 작동합니다.

다른 팁

아래 명령을 실행하여 SELinux를 비활성화해야합니다.

setsebool httpd_can_network_connect=1
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 dba.stackexchange
scroll top