개발 작업 중 갑자기 나타나는 MySQL 에러 1045만큼 개발자를 당황시키는 것도 없을 겁니다. 데이터베이스 연결이 꼭 필요한 순간에 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
같은 메시지가 뜨면 정말 답답하죠. 이번 포스트에서는 MySQL 에러 1045의 원인부터 해결법까지 체계적으로 알아보고자 합니다. 차근차근 따라하시면 분명 해결할 수 있을 거예요.
1. MySQL 에러 1045란 무엇인가?
MySQL 에러 1045는 데이터베이스 서버가 사용자의 접근 권한을 인증하지 못할 때 발생하는 접근 거부 에러입니다. 주로 WordPress 같은 웹 애플리케이션이나 명령행에서 MySQL에 연결할 때 나타나죠.
이 에러는 여러 가지 형태로 나타날 수 있어요:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
ERROR 1045 (28000): Access denied for user 'username'@'localhost' (using password: NO)
Access denied for user 'username'@'hostname' (using password: YES)
에러가 발생하는 주요 원인들
실제 현장에서 가장 자주 발생하는 원인들을 정리해보면:
원인 | 설명 |
---|---|
잘못된 자격증명 | 사용자명이나 비밀번호가 틀린 경우 |
권한 부족 | 사용자가 해당 데이터베이스에 접근할 권한이 없는 경우 |
호스트 제한 | 허가되지 않은 IP나 호스트명에서 접속을 시도하는 경우 |
존재하지 않는 사용자 | MySQL 서버에 등록되지 않은 사용자 계정 |
2. 우선, 원인부터 파악하기!
해결책을 시도하기 전에 정확한 원인을 파악하는 게 중요해요.
연결 정보 확인하기
WordPress 사이트라면 wp-config.php 파일에서 DB_USER와 DB_PASSWORD 값이 실제 MySQL 자격증명과 일치하는지 확인해보세요.
// wp-config.php에서
define('DB_NAME', '데이터베이스_이름');
define('DB_USER', '사용자명');
define('DB_PASSWORD', '비밀번호');
define('DB_HOST', 'localhost');
명령행에서 연결 테스트
문제가 애플리케이션 레벨인지 MySQL 자체인지 구분하기 위해 직접 연결을 시도해보세요:
mysql -u 사용자명 -p -h localhost
같은 에러가 발생한다면 MySQL 인증 문제가 확실합니다.
3. 가장 기본적인 해결 방법: 자격증명과 권한 문제
대부분의 에러 1045는 자격증명이나 권한 설정 문제로 발생해요. 가장 흔한 원인들부터 차례대로 해결해보겠습니다.
사용자 권한 확인 및 재설정
먼저 root 계정으로 접속해서 현재 사용자 상태를 확인해보세요:
-- root로 접속
mysql -u root -p
-- 기존 사용자와 호스트 확인
SELECT user, host, authentication_string FROM mysql.user;
-- 특정 사용자의 권한 확인
SHOW GRANTS FOR '사용자명'@'localhost';
사용자 비밀번호가 틀렸다면 재설정해주세요:
-- MySQL 5.7 이상 버전
ALTER USER '사용자명'@'localhost' IDENTIFIED BY '새_비밀번호';
-- 구버전 MySQL
SET PASSWORD FOR '사용자명'@'localhost' = PASSWORD('새_비밀번호');
-- 변경사항 즉시 적용
FLUSH PRIVILEGES;
데이터베이스 권한 부여하기
WordPress나 웹 애플리케이션의 경우 다양한 데이터베이스 권한이 필요해요. WordPress 커뮤니티에서는 호환성 문제를 피하기 위해 전체 권한을 부여하는 것을 권장하고 있습니다.
-- root로 접속
mysql -u root -p
-- WordPress용 포괄적 권한 부여
GRANT ALL PRIVILEGES ON 데이터베이스명.* TO '사용자명'@'localhost';
-- 보안을 위해 최소 권한만 부여할 경우
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, DROP ON 데이터베이스명.* TO '사용자명'@'localhost';
-- 변경사항 적용
FLUSH PRIVILEGES;
권한 종류별 설명:
권한 | 용도 | 필요한 경우 |
---|---|---|
SELECT | 테이블에서 데이터 읽기 | 콘텐츠 표시 |
INSERT | 새 레코드 추가 | 포스트, 사용자 생성 |
UPDATE | 기존 레코드 수정 | 콘텐츠 편집 |
DELETE | 레코드 삭제 | 포스트, 댓글 삭제 |
CREATE | 새 테이블 생성 | 플러그인 설치 |
ALTER | 테이블 구조 변경 | WordPress 업데이트 |
DROP | 테이블 삭제 | 플러그인 제거 |
호스트 기반 접근 문제 해결
때로는 예상과 다른 호스트에서 접속을 시도해서 에러가 발생하기도 해요. MySQL은 호스트 기반 접근 제어를 사용하거든요.
-- 현재 사용자의 허용된 호스트 확인
SELECT user, host FROM mysql.user WHERE user = '사용자명';
-- 모든 호스트에서 접속 허용
CREATE USER '사용자명'@'%' IDENTIFIED BY '비밀번호';
GRANT ALL PRIVILEGES ON 데이터베이스명.* TO '사용자명'@'%';
-- 기존 사용자의 호스트 변경
UPDATE mysql.user SET host='%' WHERE user='사용자명';
FLUSH PRIVILEGES;
-- 특정 IP에서만 접속 허용
CREATE USER '사용자명'@'192.168.1.100' IDENTIFIED BY '비밀번호';
GRANT ALL PRIVILEGES ON 데이터베이스명.* TO '사용자명'@'192.168.1.100';
4. 긴급하게 복구하는 방법: 관리자 비밀번호를 잊어버렸다면…
root 비밀번호를 잊어버려서 아예 MySQL에 접속할 수 없다면, skip-grant-tables 옵션을 사용해 임시로 인증을 우회할 수 있어요.
Linux/Ubuntu 시스템에서 복구
1단계: MySQL 서비스 중지
sudo systemctl stop mysql
# 또는 구버전의 경우
sudo service mysql stop
2단계: skip-grant-tables 설정 MySQL 설정 파일 위치를 먼저 확인해주세요:
# MySQL 설정 파일 위치 확인
mysqld --help --verbose | grep my.cnf
# 주요 위치들:
# Ubuntu 16.04+: /etc/mysql/mysql.conf.d/mysqld.cnf
# Ubuntu 구버전: /etc/mysql/my.cnf
# CentOS/RHEL: /etc/my.cnf
# 해당 파일 편집
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# [mysqld] 섹션에 다음 줄 추가
skip-grant-tables
skip-networking
3단계: MySQL 재시작 및 비밀번호 재설정
sudo systemctl start mysql
mysql -u root
# MySQL 프롬프트에서 - MySQL 8.0의 경우 반드시 FLUSH PRIVILEGES 먼저 실행
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '새_비밀번호';
FLUSH PRIVILEGES;
EXIT;
4단계: 정상 모드로 복구
# 설정 파일에서 skip-grant-tables 줄 제거
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# MySQL 정상 재시작
sudo systemctl restart mysql
Windows 시스템에서 복구
1단계: MySQL 서비스 중지
net stop mysql
# 또는
net stop mysql80 # MySQL 8.0의 경우
2단계: 복구 모드로 시작
# MySQL bin 디렉토리로 이동
cd "C:\Program Files\MySQL\MySQL Server 8.0\bin"
# skip-grant-tables로 시작
mysqld --skip-grant-tables --skip-networking
3단계: 비밀번호 재설정 (새 명령창에서)
# 비밀번호 없이 접속
mysql -u root
# MySQL 프롬프트에서
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '새_비밀번호';
FLUSH PRIVILEGES;
EXIT;
Windows는 my.ini 파일을 사용하며, 일반적인 위치는:
C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
C:\Program Files\MySQL\MySQL Server 8.0\my.ini
5. 만약, 그래도 해결이 안된다면 이 방법을 써보자!
기본 해결법으로 해결되지 않는 경우 좀 더 깊이 들어가 봐야 해요.
시스템 레벨 진단
MySQL 서비스 상태 확인
# MySQL이 실행 중인지 확인
sudo systemctl status mysql
# MySQL이 사용하는 포트 확인
sudo netstat -tlnp | grep mysql
# MySQL 포트 연결 테스트
telnet localhost 3306
MySQL 에러 로그 확인
# Ubuntu/Debian
sudo tail -f /var/log/mysql/error.log
# CentOS/RHEL
sudo tail -f /var/log/mysqld.log
데이터베이스 레벨 진단
익명 사용자 충돌 문제 때때로 MySQL의 익명 사용자가 정상적인 사용자 인증을 방해할 수 있어요.
-- 익명 사용자 확인
SELECT user, host FROM mysql.user WHERE user = '';
-- 익명 사용자 제거
DELETE FROM mysql.user WHERE user = '';
FLUSH PRIVILEGES;
인증 플러그인 문제 MySQL 8.0에서는 새로운 인증 플러그인으로 인해 호환성 문제가 발생할 수 있어요.
-- 현재 인증 플러그인 확인
SELECT user, host, plugin FROM mysql.user;
-- 구버전 인증 방식으로 변경
ALTER USER '사용자명'@'localhost' IDENTIFIED WITH mysql_native_password BY '비밀번호';
6. 해결이 되었다면, 확인하고 연결 테스트를 해보자!
문제를 해결한 후에는 반드시 다양한 방법으로 연결을 테스트해보세요.
명령행 테스트
# 기본 연결 테스트
mysql -u 사용자명 -p -h localhost
# 특정 데이터베이스 접근 테스트
mysql -u 사용자명 -p 데이터베이스명 -e "SHOW TABLES;"
# 권한 확인
mysql -u 사용자명 -p -e "SHOW GRANTS;"
WordPress 연결 테스트
WordPress CLI가 설치되어 있다면:
wp db check --path=/var/www/html
PHP 연결 테스트
간단한 PHP 스크립트로 웹 애플리케이션 연결을 확인할 수 있어요:
<?php
$servername = "localhost";
$username = "사용자명";
$password = "비밀번호";
$dbname = "데이터베이스명";
try {
$pdo = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "데이터베이스 연결 성공!";
} catch(PDOException $e) {
echo "연결 실패: " . $e->getMessage();
}
?>
MySQL 에러 1045는 처음엔 복잡해 보일 수 있지만, 체계적으로 접근하면 대부분 해결할 수 있어요. 가장 흔한 원인인 자격증명과 권한 문제부터 확인하고, 그래도 안 되면 고급 복구 방법을 시도해보세요. 이런 인증 문제가 재발하지 않도록 정기적인 사용자 권한 점검과 보안 조치도 잊지 마시고요. MySQL 데이터베이스를 안정적으로 관리하는 데 이 포스트가 도움이 되었으면 합니다. 🙂