MariaDB root 비밀번호 변경 방법 : 설치 후 암호 설정, 분실 시 초기화까지

🏷️ 리눅스

MariaDB에서 root 비밀번호 변경은 sudo mariadb로 접속한 뒤 ALTER USER를 실행하는 방식입니다.

Ubuntu나 Debian에 MariaDB 10.4 이상을 설치하면 root에는 초기 비밀번호가 없고, 대신 서버 OS의 root 사용자만 비밀번호 없이 접속하는 unix_socket 인증이 적용되어 sudo가 필요합니다.

일반 계정에서 mariadb -u root -p를 입력하면 ERROR 1698 (28000): Access denied for user 'root'@'localhost'가 뜨는 것도 같은 이유입니다.

단, 10.3 이하는 설치 직후 root 비밀번호가 비어 있고 윈도우는 설치 마법사에서 정한 비밀번호가 곧 초기 비밀번호입니다. 이미 설정한 비밀번호를 잊었다면 인증을 우회해서 초기화해야 합니다.

1. MariaDB root 비밀번호 변경 전 처음 적용된 인증 방식 확인하기

리눅스나 macOS 패키지로 설치한 MariaDB 10.4 이상의 root 계정에는 초기 비밀번호가 없으며 설치 스크립트가 root 비밀번호를 묻지 않고 unix_socket으로 접속하도록 root 계정을 자동으로 만듭니다. unix_socket은 OS의 root 사용자라는 사실을 확인해 비밀번호 없이 root@localhost 로그인을 허용하는 방식입니다.

MariaDB를 처음 쓴다면 서버의 터미널에서 아래 내용을 순서대로 입력합니다. macOS는 터미널 앱을 엽니다.

MariaDB 서버 실행 상태와 버전 확인하기

접속하려면 MariaDB 서버가 켜져 있어야 합니다. Active: active (running)이 보이면 서버가 실행 중입니다.

sudo systemctl status mariadb

꺼져 있으면 접속 명령이 ERROR 2002 (HY000): Can't connect to local server through socket으로 실패합니다. 화면이 멈춘 것처럼 보이면 q를 눌러 빠져나옵니다. inactive (dead)가 보이면 sudo systemctl start mariadb로 서버를 시작합니다.

macOS는 brew services list에서 MariaDB 서비스가 started인지 확인합니다. 서비스 이름이 mariadb@10.11처럼 버전이 붙어 있으면 brew services start mariadb@10.11처럼 그 이름을 그대로 씁니다.

설치된 버전은 아래 명령으로 확인합니다. 출력의 Distrib 뒤 숫자가 서버 버전이며, 10.4 이상이어야 이 글의 sudo mariadb 방식이 적용됩니다.

mariadb --version

10.3 이하 패키지는 mysql --version으로 확인합니다.

MariaDB에 접속하기

서버가 실행 중이면 환경에 맞는 명령으로 접속합니다. MariaDB [(none)]> 프롬프트가 나오면 SQL을 입력할 수 있는 상태입니다.

환경접속 명령비고
Ubuntu, Debiansudo mariadbDebian과 Ubuntu 기본 저장소에서 받는 패키지는 unix_socket 인증이 켜진 채로 배포됩니다
macOS (Homebrew)mariadb현재 로그인한 macOS 사용자 이름의 계정으로 접속합니다. mariadb -u root는 거부됩니다
Windows"C:\Program Files\MariaDB 10.11\bin\mariadb.exe" -u root -p설치 마법사에서 정한 root 비밀번호를 입력합니다
10.3 이하mysql -u root설치 직후에는 root 비밀번호가 비어 있습니다

sudo는 관리자 권한으로 명령을 실행하는 명령어라서, 현재 로그인한 계정의 OS 비밀번호를 묻는 경우가 있습니다. 이 비밀번호는 MariaDB 비밀번호가 아니며 입력해도 화면에 표시되지 않습니다.

프롬프트에서 입력하는 SQL 문장은 끝에 세미콜론(;)을 붙여야 실행됩니다. 접속을 끝내려면 EXIT;를 입력합니다.

root 계정의 인증 방식 확인하기

접속한 상태에서 SHOW CREATE USER를 입력하면 root 계정이 어떤 방식으로 인증하는지 볼 수 있습니다.

SHOW CREATE USER 'root'@'localhost';

10.11 기준 결과는 다음과 같습니다. 'invalid'는 유효하지 않은 해시라서 비밀번호로는 로그인할 수 없고, 뒤의 OR unix_socket으로만 접속된다는 뜻입니다.

CREATE USER `root`@`localhost` IDENTIFIED VIA mysql_native_password USING 'invalid' OR unix_socket

SELECT plugin FROM mysql.user로는 unix_socket을 확인할 수 없습니다. 같은 계정이 plugin 열에 mysql_native_password로만 표시되기 때문입니다.

2. ALTER USER로 MariaDB root 비밀번호 설정하기

MariaDB root 비밀번호를 설정하려면, sudo mariadb로 접속한 상태에서 ALTER USER를 실행합니다. 이 명령은 root의 인증 방식을 비밀번호 하나로 교체하므로 unix_socket 접속도 함께 없어집니다.

sudo mariadb로 접속해 MariaDB [(none)]> 프롬프트가 나오면 아래 SQL을 입력합니다. macOS는 sudo mariadb 대신 mariadb로 접속합니다.

ALTER USER 'root'@'localhost' IDENTIFIED BY '새_비밀번호';

'새_비밀번호' 자리에는 실제로 사용할 비밀번호를 작은따옴표 안에 적고, 비밀번호 안에는 작은따옴표(')를 넣지 않습니다. 'root'@'localhost'는 서버 안에서 접속하는 root 계정을 가리키는 이름입니다.

Query OK, 0 rows affected가 출력되면 변경이 끝난 것입니다.

ALTER USER는 바로 적용되므로 FLUSH PRIVILEGES를 실행하지 않아도 됩니다. IDENTIFIED VIA mysql_native_password USING PASSWORD('새_비밀번호') 형태로 실행해도 10.11에서는 같은 비밀번호로 로그인할 수 있습니다.

EXIT;로 접속을 종료한 뒤 새 비밀번호로 다시 접속해 적용됐는지 확인합니다.

mariadb -u root -p

-u root는 접속할 계정, -p는 비밀번호를 직접 입력하겠다는 옵션입니다. Enter password:가 나오면 새 비밀번호를 입력하고 Enter를 누릅니다. 입력한 글자는 화면에 표시되지 않습니다.

SELECT CURRENT_USER();

root@localhost가 반환되면 새 비밀번호가 적용된 것을 확인할 수 있습니다. 이후 sudo mariadb는 Access denied로 막히고, 비밀번호를 입력하는 접속만 가능합니다.

macOS에서도 mariadb로 접속한 계정이 전체 권한을 가지므로 같은 SQL이 그대로 동작합니다.

sudo mariadb 접속을 유지한 채 비밀번호 추가하기

sudo mariadb 접속을 남겨 두고 비밀번호 로그인만 추가하려면 SET PASSWORD를 사용합니다. SET PASSWORD로 비밀번호를 지정하면 sudo를 통한 비밀번호 없는 접속이 그대로 유지됩니다.

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('새_비밀번호');

Query OK가 출력되면 EXIT;로 나와 mariadb -u root -p와 sudo mariadb를 각각 실행해 두 방식이 모두 접속되는지 확인합니다.

mariadb-secure-installation으로 설정하기

mariadb-secure-installation은 root 비밀번호 설정을 묻는 대화형 스크립트입니다. unix_socket이 기본으로 적용되는 10.4 이상에서 sudo mariadb 접속을 유지하려면 이 스크립트에서 root 비밀번호를 따로 만들지 않아도 됩니다.

sudo mariadb-secure-installation

Enter current password for root에서는 Enter를 누릅니다.

10.4 이상에서는 Switch to unix_socket authentication도 묻는데, 비밀번호 접속을 쓰려면 n을 선택합니다. Change the root password?에서 Y를 선택한 뒤 새 비밀번호를 두 번 입력합니다.

이후에는 익명 사용자를 삭제할지(Remove anonymous users?), root의 원격 로그인을 차단할지(Disallow root login remotely?), test 데이터베이스를 삭제할지(Remove test database and access to it?), 권한 테이블을 다시 읽을지(Reload privilege tables now?) 묻습니다. 모두 Y로 답합니다.

완료한 뒤에는 SHOW CREATE USER 'root'@'localhost';로 unix_socket이 남았는지 확인합니다.

3. simple_password_check로 MariaDB 비밀번호 복잡도 설정하기

MariaDB 비밀번호 복잡도는 simple_password_check 플러그인을 설치해야 적용됩니다. 플러그인 라이브러리는 함께 배포되지만 기본으로 설치되지는 않으며, 처음 설치하면 8자 이상에 숫자, 대문자, 소문자, 특수문자를 각각 1개 이상 요구합니다.

플러그인을 설치하려면, 먼저 MariaDB에 접속합니다.

2번에서 ALTER USER로 비밀번호를 설정했다면 mariadb -u root -p, 설정하지 않았다면 Ubuntu와 Debian은 sudo mariadb, macOS는 mariadb입니다. 접속한 상태에서 플러그인이 이미 설치됐는지 확인합니다.

SHOW VARIABLES LIKE 'simple_password%';

Empty set이 나오면 설치되지 않은 상태입니다. INSTALL SONAME으로 설치하면 mysql.plugin 테이블에 등록되므로 서버를 재시작해도 유지됩니다.

INSTALL SONAME 'simple_password_check';
SHOW VARIABLES LIKE 'simple_password%';
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM information_schema.PLUGINS WHERE PLUGIN_NAME = 'simple_password_check';

변수 네 개가 출력되고 PLUGIN_STATUS가 ACTIVE이면 정상입니다. 기준은 변수 네 개로 조정합니다.

변수기본값의미
simple_password_check_minimal_length8최소 글자 수
simple_password_check_digits1최소 숫자 개수
simple_password_check_letters_same_case1대문자와 소문자 각각의 최소 개수
simple_password_check_other_characters1숫자와 문자를 제외한 특수문자의 최소 개수

최소 글자 수를 12로 올리려면 SET GLOBAL simple_password_check_minimal_length=12;를 입력합니다. 이 값은 서버를 재시작하면 8로 돌아오므로 영구 적용을 하려면 설정 파일에 추가합니다.

환경설정 파일
Ubuntu, Debian/etc/mysql/mariadb.conf.d/99-password-policy.cnf
macOS (Homebrew)/opt/homebrew/etc/my.cnf.d/99-password-policy.cnf (Intel 맥은 /usr/local/etc/my.cnf.d/)

Ubuntu와 Debian은 sudo nano /etc/mysql/mariadb.conf.d/99-password-policy.cnf로 새 파일을 엽니다.

macOS는 nano /opt/homebrew/etc/my.cnf.d/99-password-policy.cnf를 입력합니다. 아래 내용을 붙여넣고 Ctrl + O, Enter, Ctrl + X를 눌러 저장하고 나옵니다.

[mysqld]
simple_password_check_minimal_length=12

저장한 뒤 sudo systemctl restart mariadb로 재시작합니다.

macOS는 brew services restart mariadb를 사용합니다. 재시작 후 mariadb -u root -p로 다시 접속해 SHOW VARIABLES LIKE 'simple_password_check_minimal_length';의 값이 12인지 확인합니다.

root 비밀번호를 설정하지 않았다면 Ubuntu와 Debian은 sudo mariadb, macOS는 mariadb로 접속합니다.

정책을 어기면 명령에 따라 오류 번호가 다르게 나옵니다. ALTER USER는 원인을 드러내지 않고 ERROR 1396을 반환합니다.

명령위반 시 오류
SET PASSWORDERROR 1819 (HY000): Your password does not satisfy the current policy requirements
ALTER USERERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'localhost'

정책은 새로 지정하는 비밀번호부터 검사합니다. 이미 설정한 비밀번호로는 플러그인을 설치한 뒤에도 그대로 로그인할 수 있습니다.

4. –skip-grant-tables로 MariaDB root 비밀번호 분실 초기화하기

MariaDB root 비밀번호를 분실했다면 서버를 --skip-grant-tables로 다시 띄워 인증 없이 접속한 뒤 새 비밀번호를 지정합니다.

이 옵션은 권한 테이블을 읽지 않아 모든 사용자에게 전체 접근 권한을 줍니다. 그래서 --skip-networking을 함께 지정해 외부 접속을 막고, 작업이 끝나면 곧바로 원래 상태로 되돌립니다.

Ubuntu, Debian에서 초기화하기

Ubuntu와 Debian은 systemctl set-environment로 MYSQLD_OPTS 환경 변수에 --skip-grant-tables 옵션을 지정해 서비스를 시작합니다. 서비스를 중지하고, 옵션을 지정하고, 다시 시작하는 세 줄입니다.

sudo systemctl stop mariadb
sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables --skip-networking"
sudo systemctl start mariadb

옵션이 적용됐는지 프로세스 목록에서 확인합니다. 출력에 --skip-grant-tables가 보이면 인증을 건너뛰는 모드로 실행 중입니다.

ps -ef | grep mariadbd

이 모드에서는 비밀번호 없이 접속됩니다. MariaDB [(none)]> 프롬프트가 나오면 SQL을 입력할 수 있습니다.

sudo mariadb

접속한 직후 FLUSH PRIVILEGES를 먼저 실행합니다. 이 순서를 건너뛰고 ALTER USER를 입력하면 ERROR 1290 (HY000): The MariaDB server is running with the --skip-grant-tables option so it cannot execute this statement가 반환됩니다.

FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '새_비밀번호';
EXIT;

비밀번호를 바꿨으면 환경 변수를 지우고 서비스를 정상 모드로 재시작합니다.

sudo systemctl stop mariadb
sudo systemctl unset-environment MYSQLD_OPTS
sudo systemctl start mariadb

ps -ef | grep mariadbd 출력에 --skip-grant-tables가 남아 있지 않아야 합니다. 마지막으로 새 비밀번호로 접속되는지 확인합니다. Enter password:에서 새 비밀번호를 입력합니다.

mariadb -u root -p

macOS에서 초기화하기

macOS의 Homebrew는 systemd가 없으므로 서버를 터미널에서 직접 실행합니다.

서비스 이름은 brew services list로 확인하며, 이름이 mariadb@10.11처럼 버전이 붙어 있으면 아래 brew services stop mariadb의 mariadb를 그 이름으로 바꾸고(mariadbd는 그대로 둡니다), 비밀번호 변경 뒤 서비스를 다시 시작하는 brew services start mariadb도 같은 이름으로 바꿉니다. 데이터 폴더는 $(brew --prefix)/var/mysql입니다.

터미널 창 1에서 서비스를 중지하고 mariadbd를 직접 실행합니다. 이 명령은 터미널을 점유하므로 창 1은 그대로 둡니다.

brew services stop mariadb
mariadbd --datadir="$(brew --prefix)/var/mysql" --skip-grant-tables --skip-networking --socket=/tmp/mariadb-reset.sock

터미널 창 2를 새로 열어 같은 소켓으로 접속합니다.

mariadb --socket=/tmp/mariadb-reset.sock -u root

접속한 상태에서 FLUSH PRIVILEGES와 ALTER USER를 실행합니다.

FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '새_비밀번호';
EXIT;

비밀번호 변경이 끝나면 창 1에서 Ctrl + C로 mariadbd를 종료하고 brew services start mariadb로 정상 서비스를 시작합니다. mariadb -u root -p로 새 비밀번호 접속을 확인합니다.

5. 윈도우에서 MariaDB root 비밀번호 분실 초기화하기

윈도우에서 root 계정의 초기 비밀번호는 MSI로 설치할 때 마법사에서 root 비밀번호로 직접 지정한 값입니다. 이 암호를 잊었다면 서비스를 중지하고 mariadbd.exe를 --skip-grant-tables로 직접 실행해야 합니다.

서비스의 실제 이름과 설정 파일 경로는 환경마다 다릅니다. Win + R을 눌러 services.msc를 입력하면 서비스 창이 열립니다. MariaDB 서비스를 더블클릭해 속성에서 서비스 이름과 실행 파일 경로에 적힌 --defaults-file 값을 확인합니다. 확인한 값을 아래 예시에 대입합니다.

명령 프롬프트는 시작 메뉴에서 cmd를 검색해 관리자 권한으로 실행을 선택해 엽니다. 이 글에서는 창 두 개를 쓰며, 둘 다 관리자 권한으로 엽니다.

창 1에서 서비스를 중지하고 mariadbd.exe를 실행합니다. 이 창은 작업이 끝날 때까지 닫지 않습니다.

net stop MariaDB
"C:\Program Files\MariaDB 10.11\bin\mariadbd.exe" --defaults-file="C:\Program Files\MariaDB 10.11\data\my.ini" --console --skip-grant-tables --bind-address=127.0.0.1

창 2에서 접속해 root 계정의 Host부터 확인합니다.

HeidiSQL처럼 127.0.0.1로 접속하는 프로그램은 root@localhost가 아니라 root@127.0.0.1 계정을 사용하므로, 실제 접속 계정의 Host에 ALTER USER를 실행해야 합니다.

아래 ALTER USER의 localhost는 SELECT 결과에 나온 Host 값으로 바꿔 입력합니다. root 행이 여러 개이면 사용하는 프로그램이 접속하는 Host마다 ALTER USER를 실행합니다.

"C:\Program Files\MariaDB 10.11\bin\mariadb.exe" -h 127.0.0.1 -u root
FLUSH PRIVILEGES;
SELECT User, Host FROM mysql.user WHERE User = 'root';

SELECT 결과의 Host를 확인한 뒤 ALTER USER를 실행합니다.

ALTER USER 'root'@'localhost' IDENTIFIED BY '새_비밀번호';
EXIT;

창 1에서 Ctrl + C로 mariadbd.exe를 종료한 뒤 net start MariaDB로 서비스를 시작합니다. 서비스 이름이 다르면 services.msc에서 확인한 이름을 사용합니다.

새 비밀번호는 창 2에서 "C:\Program Files\MariaDB 10.11\bin\mariadb.exe" -h 127.0.0.1 -u root -p로 접속해 확인합니다.

마치며

MariaDB 10.4 이상의 root는 비밀번호 대신 unix_socket으로 접속되도록 만들어지므로, 초기 비밀번호를 찾기보다 sudo mariadb로 접속해 비밀번호를 지정하는 순서를 적용합니다.

비밀번호 복잡도 플러그인을 설치해 두면 이후 비밀번호를 바꿀 때 약한 비밀번호를 걸러 줍니다. 분실 초기화는 최후의 수단이므로, --skip-grant-tables로 띄운 서버가 외부에 열려 있지 않은지 확인하고 작업 직후 정상 모드로 되돌려야 합니다.

FAQ

비밀번호를 설정한 뒤 sudo mariadb 접속 방식을 되살리려면 어떻게 하나요?

ALTER USER로 비밀번호를 설정하면 unix_socket이 사라지므로, 비밀번호로 접속한 상태에서 인증 방식을 다시 지정합니다. 아래 명령은 sudo mariadb 접속과 비밀번호 접속을 모두 허용합니다.
ALTER USER 'root'@'localhost' IDENTIFIED VIA unix_socket OR mysql_native_password USING PASSWORD('새_비밀번호');

UPDATE mysql.user로 비밀번호를 바꿀 수 없나요?

10.4 이상에서는 바꿀 수 없습니다. mysql.user가 mysql.global_priv 테이블을 참조하는 뷰로 바뀌었기 때문입니다. 10.11에서 UPDATE mysql.user SET authentication_string=...를 실행하면 ERROR 1356 (HY000): View 'mysql.user' references invalid table(s)가 반환되며 기존 비밀번호로만 로그인할 수 있습니다. 구버전 글의 UPDATE 방식 대신 ALTER USER나 SET PASSWORD를 사용합니다.

비밀번호 복잡도 정책을 해제하려면 어떻게 하나요?

UNINSTALL SONAME 'simple_password_check';을 실행하면 플러그인이 제거되어 정책이 해제됩니다. 설정 파일에 plugin_load_add = simple_password_check를 적어 설치했다면 그 줄도 지워야 재시작 후 다시 적용되지 않습니다.

MariaDB

저자

댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Fill out this field
Fill out this field
올바른 이메일 주소를 입력해주세요.

같은 카테고리 글

Linux 크론탭 Crontab 사용법
Linux 크론탭(Crontab) 사용법
크론탭(Crontab)은 리눅스에서 정해진 시간에 스크립트나 데몬 등을 실행하는 스케줄러(Scheduler) 기능입니다. 특정 시간, 요일에 특정한 작업을 실행해야 하거나 반복…