MySQL을 처음 다루거나 새로운 서버에 접속할 때 가장 자주 마주치는 에러가 "MySQL ERROR 1045: Access denied for user" 이다. 에러 메시지는 간단하지만, 정확히 어디서 문제가 발생했는지 파악하기가 쉽지 않아서 많은 사람들이 헷갈려한다. 특히 처음 데이터베이스를 설정할 때나, 권한 설정이 필요한 상황에서 더욱 그렇다. 

 

이번 글에서는 MySQL ERROR 1045가 발생하는 다양한 상황과 상황별 해결 방법, 그리고 향후 같은 문제를 방지하기 위한 권한 설정 방법을 정리해서 소개하겠다. 

 

ERROR 1045 의 의미

먼저 에러 메시지를 자세히 보면:

ERROR 1045 (28000): Access denied for user 'username'@'hostname' (using password: YES/NO)
  • username : 접속하려던 MySQL 사용자명
  • hostname : 접속하려는 컴퓨터/서버 주소 (localhost, 127.0.0.1, IP 주소 등)
  • using password : 비밀번호를 입력했는지 여부 (YES면 비번 입력했음, NO면 입력 안 함)

즉, 이 에러는 "해당 사용자가 해당 호스트에서 해당 비밀번호로는 접속할 수 없다"는 뜻이다. 

 

상황별 원인과 해결법

1. 비밀번호가 잘못됨

가장 흔한 경우다. 비밀번호를 다시 한 번 확인해보자.

# 터미널에서 MySQL 접속
mysql -u username -p
# 비밀번호 입력 (틀렸으면 ERROR 1045)

# 또는 비밀번호를 직접 지정해서 접속
mysql -u username -ppassword -h localhost

PHP에서 접속할 때도 마찬가지다:

<?php
// 비밀번호가 잘못되면 ERROR 1045 발생
$mysqli = new mysqli('localhost', 'username', 'wrong_password', 'database');

if($mysqli->connect_error) {
   die('ERROR: ' . $mysqli->connect_error);
}
?>

 

2. 사용자가 존재하지 않음

MySQL에 해당 사용자가 생성되지 않았을 수도 있다. MySQL root 권한으로 접속해서 사용자 목록을 확인해보자.

-- root로 접속
mysql -u root -p

-- 현재 존재하는 사용자 확인
SELECT user, host FROM mysql.user;

-- 결과 예시:
-- | user             | host      |
-- | root             | localhost |
-- | mysql.infoschema | localhost |
-- | mysql.sys        | localhost |

원하는 사용자가 없으면 생성해야 한다:

-- 새로운 사용자 생성
CREATE USER 'webuser'@'localhost' IDENTIFIED BY 'password123';

-- 또는 특정 IP에서만 접속 가능하도록
CREATE USER 'webuser'@'192.168.1.100' IDENTIFIED BY 'password123';

-- 모든 호스트에서 접속 가능하도록 (보안 주의)
CREATE USER 'webuser'@'%' IDENTIFIED BY 'password123';

-- 생성 확인
SELECT user, host FROM mysql.user WHERE user='webuser';

 

3. 데이터베이스에 대한 권한이 없음

사용자가 존재하지만, 특정 데이터베이스에 접근할 권한이 없을 수도 있다. 권한을 부여해야 한다:

-- 특정 데이터베이스의 모든 권한 부여
GRANT ALL PRIVILEGES ON database_name.* TO 'webuser'@'localhost';

-- 특정 권한만 부여 (SELECT, INSERT, UPDATE, DELETE)
GRANT SELECT, INSERT, UPDATE, DELETE ON database_name.* TO 'webuser'@'localhost';

-- 권한 변경사항 적용
FLUSH PRIVILEGES;

-- 권한 확인
SHOW GRANTS FOR 'webuser'@'localhost';

 

4. 호스트(hostname) 불일치

자주 간과하는 부분인데, MySQL에는 같은 사용자명이라도 접속 호스트에 따라 다른 권한을 가질 수 있다. 

-- 예시: 같은 username이라도 다른 권한
CREATE USER 'webuser'@'localhost';     -- localhost에서만 접속 가능
CREATE USER 'webuser'@'192.168.1.100'; -- 192.168.1.100에서만 접속 가능

-- 따라서 접속할 때 호스트를 정확히 지정해야 함
mysql -u webuser -p -h localhost      -- OK
mysql -u webuser -p -h 192.168.1.100  -- OK
mysql -u webuser -p -h 127.0.0.1      -- ERROR 1045 (192.168.1.100만 허용된 경우)

PHP에서도 호스트를 정확히 지정해야 한다:

<?php
// localhost와 127.0.0.1은 다를 수 있음
$mysqli = new mysqli('localhost', 'webuser', 'password', 'database');    // OK
$mysqli = new mysqli('127.0.0.1', 'webuser', 'password', 'database');    // ERROR 1045

// 연결 에러 처리
if($mysqli->connect_error) {
   die('ERROR: ' . $mysqli->connect_error);
}
?>

 

5. 대소문자 또는 공백 오류

사용자명이나 비밀번호에 공백이 있거나 대소문자가 틀릴 수 있다. 정확히 확인해보자:

# 비밀번호에 공백이 있는 경우 주의
mysql -u username -p'password with space' -h localhost

# 사용자명도 대소문자 구분
mysql -u WebUser -p
mysql -u webuser -p
# 이 둘은 다른 사용자다

 

PHP PDO / MySQLi 별 해결 방법

PDO 사용:

<?php
try {
   $pdo = new PDO(
      'mysql:host=localhost;dbname=database_name',
      'username',
      'password'
   );
   echo 'Connected successfully';
} catch(PDOException $e) {
   echo 'ERROR 1045: ' . $e->getMessage();
   // 출력: "SQLSTATE[28000]: Invalid user name/password"
}
?>

MySQLi 사용:

<?php
$mysqli = new mysqli('localhost', 'username', 'password', 'database_name');

if($mysqli->connect_error) {
   die('ERROR ' . $mysqli->connect_errno . ': ' . $mysqli->connect_error);
   // 출력: "ERROR 1045: Access denied for user 'username'@'localhost'"
}

echo 'Connected successfully';
$mysqli->close();
?>

 

권한 설정 체크리스트

새로운 데이터베이스와 사용자를 만들 때 이 순서대로 진행하면 ERROR 1045를 피할 수 있다:

-- 1. root로 접속
mysql -u root -p

-- 2. 새로운 데이터베이스 생성
CREATE DATABASE my_database;

-- 3. 새로운 사용자 생성
CREATE USER 'my_user'@'localhost' IDENTIFIED BY 'strong_password_123';

-- 4. 사용자에게 데이터베이스 권한 부여
GRANT ALL PRIVILEGES ON my_database.* TO 'my_user'@'localhost';

-- 5. 권한 적용
FLUSH PRIVILEGES;

-- 6. 권한 확인
SHOW GRANTS FOR 'my_user'@'localhost';

-- 7. 생성한 사용자로 접속 테스트
-- 다른 터미널에서:
mysql -u my_user -p -h localhost
-- my_database 사용
USE my_database;
-- 테이블 확인
SHOW TABLES;

 

일반적인 실수
  • localhost와 127.0.0.1 혼동 : 권한 설정할 때는 접속할 호스트와 정확히 같아야 함
  • 권한 부여 후 FLUSH PRIVILEGES 누락 : 권한 변경 후 반드시 FLUSH 해야 적용됨
  • 비밀번호 저장 시 평문 사용 : 설정 파일에 비밀번호를 평문으로 남기지 말 것
  • 모든 호스트(%)에 권한 부여 : 보안을 위해 필요한 호스트만 지정할 것
  • MySQL 재시작 없이 설정 변경 : 권한 설정은 FLUSH PRIVILEGES로 즉시 적용됨, 재시작 불필요

 

MySQL ERROR 1045는 단순해 보이지만, 여러 원인이 복합적으로 작용할 수 있다. 따라서 체계적으로 접근하는 것이 중요하다. 위의 체크리스트를 따라 진행하면 대부분의 ERROR 1045 문제는 해결할 수 있을 것이다. 특히 새로운 프로젝트를 시작할 때 처음부터 권한을 제대로 설정해두면 나중에 많은 시간을 절약할 수 있다.