뭘 이런걸..

Posted
Filed under Tech/Tip & Trick
MariaDB 10.4 부터 mysql database 의 user table 에 변경이 발생했습니다.

mysql> UPDATE USER SET Password = password('PASS_STRING');
mysql> flush privileges;

위와 같이 기존의 방식으로 변경을 하면 다음과 같은 에러가 발생 합니다.

ERROR 1348 (HY000): Column ‘Password’ is not updatable.

이 이유는, 10.4 부터는 user table 이 없어지고 global_priv table 이 그 역할을 대신 하기 때문입니다. show tables 시에 보여지는 user table은 global_priv 등의 table를 이용하여 view 로서 대신 하게 되었기 때문에 user table 을 update 하는 것이 불가능 합니다.
MariaDB [mysql]> SHOW FULL TABLES IN mysql WHERE TABLE_TYPE LIKE 'VIEW';
+-----------------+------------+
| Tables_in_mysql | Table_type |
+-----------------+------------+
| user | VIEW |
+-----------------+------------+
1 row in set (0.007 sec)

https://mariadb.com/kb/en/library/authentication-from-mariadb-104/

위의 문서를 읽어 보시면 몇가지 특징이 있는데, mysql 10.4 부터는 더이상 mysql 의 root 계정에 대한 암호를 기본적으로는 물어보지 않습니다. 이 이유는 오직 root account 로 mysql client 를 실행 했을 경우에만 암호가 없이 동작을 하며, 기타 다른 일반 account 로는 -u root 를 이용하여 접속이 불가능 함을 의미합니다. 즉, 일반 유저로 mysql root 연결이 필요 없다면, 더이상 mysql root 암호를 지정할 필요가 없다는 얘기입니다.

역설적으로 일반 account 에서 mysql root 로 연결을 할 필요가 있다면 mysql root 암호를 변경해 주어야 한다는 얘기도 됩니다.

여기서는 일반 account 에서 mysql root 로 연결을 하고 싶을 때 root account 의 암호를 변경하는 방법입니다.

일단은
SELECT password('PASSWORD_STRING');
query 를 이용하면 암호화된 문자열을 얻을 수 있습니다. 이 정보를 가지고 global_priv table의 Priv field 의 값을 수정해 주면 됩니다. (https://www.reddit.com/r/sysadmin/comments/avx1u6/how_to_change_the_root_password_with_mariadb_104/ 참조)

하지만 이렇게 하면 굉장히 번거롭기 때문에 다음과 같이 query 하나로도 변경이 가능 합니다.

ALTER USER 'root'@'localhost' IDENTIFIED BY 'PASSWORD_STRING';




단, mariadb 10.3 이하 버전에서 업그레이드를 하여 mysql_upgrade 를 실행한 경우에는, 위의 조건이 성립하지 않습니다. mysql_upgrade 를 이용하여 mysql table을 10.4 용으로 업그레이드 한 경우에는 기본의 mysql database 의  table 들이 유지가 되게 됩니다. 즉, 이 경우에는 global_priv database 가 생성이 되지 않고 user table 이 view가 아니라 여전히 table 이 되게 됩니다.
2019/08/12 16:37 2019/08/12 16:37