개발 작업 중 갑자기 나타나는 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 데이터베이스를 안정적으로 관리하는 데 이 포스트가 도움이 되었으면 합니다. 🙂

 

댓글 남기기