[번역] MySQL 5.7.6 릴리즈. 큰 변화에 준비하자.
이 글은 “MySQL 5.7.6 is out. Be prepared for big changes” 를 원작자의 허락을 받아 번역한 것입니다. 원본은 아래의 주소에 있습니다. 번역을 허락해준 Giuseppe Maxia 씨에게 감사 합니다.
오늘 오라클(Oracle)이 MySQL 5.7.6 마일스톤 16을 릴리즈(Release) 했다. 이것으로 MysQL 5.7 은 개발에 2년이 넘게 소요됐다. MySQL 5.6과 비교해 바뀐점은 아주 넓다. 주요한 팀(개발 팀)의 노력은 이전 릴리즈와 비교해 2배에서 3배의 성능 향상을 가지는 , MySQL 의 동작,스피드에 포커스를 맞춰왔다. 무엇이 새로운지에 대한 전체 리스트는 여기에 가지고 오기에는 너무나 많은 공간이 필요해, 나는 몇가지 키포인트들만 언급할 것이다.
- 오라클은 MySQL 보안과 안전성 개선에 상당히 많은 에너지를 소비했다. 많은 새로운 기능을 볼수 있겠지만 아주 오래된 기능들은 deprecated 되었고 5.6에서 deprecated 된것들은 삭제되었다.
- 설치과정은 MySQL 5.7 릴리즈되는 매 마일스톤마다 항상 좀 더 향상되는 것을 목표로 바뀌어왔다.하지만 이러한 노력은 이전버전과의 호환성을 깰 것이다.
이 기사에서는 나는 설치과정에서 크게 바뀐 부분을 언급할 것이다. MySQL 5.6 에서 mysql_install_db 는 데이터베이스 생성중에 랜덤 패스워드 생성기에 대한 옵션을 가지고 있다. 이 과정은 익숙하지 않지만 오랜시간동안 패스워드없이 root 사용자를 생성하도록 했던것을 직접적으로 끝장을 내는 행보였다. MySQL 5.7.4 에서, 그것은 좀더 바뀌어서, 랜덤 패스워드 생성기는 -skip-random-password 옵션으로 건너뛸 수 있지만 어쨌든 기본값이 됐다. MySQL 5.7.5 에서, 기본은 확정되었고 옵션은 -insecure 로 바뀌었다.
그리고 이제, MySQL 5.7.6 에서, 오래된 관행을 단속하고자: mysql_install_db 는 deprecated 됐고 mysqld -initalize 로 바뀌었다. (예전에 “mysqld -bootstrap” 으로 알려졌던 것은 현재 deprecated 됐다)
여기서 테스트 해보자:
1 2 3 4 5 6 7 |
$ ~/opt/mysql/5.7.6/bin/mysqld --no-defaults --basedir=~/opt/mysql/5.7.6/ --datadir=$PWD/data --initialize 2015-03-09T05:06:37.159659Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2015-03-09T05:06:37.355155Z 0 [Warning] InnoDB: New log files created, LSN=45790 2015-03-09T05:06:37.410118Z 0 [Warning] InnoDB: Creating foreign key constraint system tables. 2015-03-09T05:06:37.467002Z 0 [Warning] Failed to setup SSL 2015-03-09T05:06:37.467029Z 0 [Warning] SSL error: SSL context is not usable without certificate and private key 2015-03-09T05:06:37.468142Z 1 [Warning] A temporary password is generated for root@localhost: f<jqhdJ(A5p# |
이전 버전과 비교해, 가장 주목할 차이는 .mysql_secret 파일이 없다는 것이고 스크린에 임시 패스워드가 짧은 줄로 언급된다. 또, 한가지 더 중요한 행동상의 차이점으로 이 명령어는 오직 한번만 작동한다. 만약 데이터 디렉토리가 존재한다면, 그 스크립트는 데이터 생성 명령어들을 다시 적용할려고 할 것이다. mysqld -initialize 사용은 데이터 디렉토리가 존재하지 않을때에만 실행된다.
1 2 3 4 |
$ ~/opt/mysql/5.7.6/bin/mysqld --no-defaults --basedir=~/opt/mysql/5.7.6/ --datadir=$PWD/data --initialize 2015-03-09T05:49:12.504413Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2015-03-09T05:49:12.505398Z 0 [ERROR] --initialize specified but the data directory exists. Aborting. 2015-03-09T05:49:12.505422Z 0 [ERROR] Aborting |
새롭게 생성된 데이터베이스 사용을 위해서는 이전과는 다른 꼼수가 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ ~/opt/mysql/5.7.6/bin/mysql --no-defaults -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.6-m16 Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use mysql ERROR 1820 (HY000): You must SET PASSWORD before executing this statement mysql> set password=password('test'); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'password('test')' at line 1 |
우잉? 이게 뭘까? 이 명령어는 최근까지 잘 동작했다. 원인은 SET PASSWORD 문법이 변경되었는데 이제는 생자 텍스트를 인수로 받는다.
1 2 |
mysql> set password='test'; Query OK, 0 rows affected (0.00 sec) |
오래된 문법은 오직 deprecated 되었다는걸 뜻하지만 이것은 순간적으로 완벽하게 제거될 수 있다. 이것은 MySQL 5.7.7 에서 고쳐지길 희망한다. (뭔소리냐.. ㅡㅡ;;)
더 많은 변화는 GRANT, REVOKE, CREATE USER, 그리고 ALTER USER 사용에서 일어났는데 현재 좀 더 제한적이다. 만약 GRANT 명령어로 사용자들을 생성하려고 한다거나 승인권한을 인증옵션과 섞으려고할때에 경고 메시지를 받을 수 있다.
1 2 3 4 5 6 7 8 9 |
mysql> GRANT ALL ON test.* TO testuser IDENTIFIED BY 'test'; Query OK, 0 ROWS affected, 1 warning (0.00 sec) Warning (Code 1287): USING GRANT FOR creating NEW USER IS deprecated AND will be removed IN future release. CREATE NEW USER WITH CREATE USER statement. mysql> GRANT ALL ON *.* TO testuser IDENTIFIED BY 'test'; Query OK, 0 rows affected, 1 warning (0.00 sec) Warning (Code 1287): USING GRANT statement TO MODIFY existing USER's properties other than privileges is deprecated and will be removed in future release. Use ALTER USER statement for this operation. |
요컨대, 만약 MySQL을 설치하고 관리하는 자동화된 스크립트를 가지고 있다면, 당신은 waringins 을 활성화하고 테스트해야 한다, 오래된 관습을 가지는 호환성이 깨지는것에 대비해야 한다.
One such ‘old practice’ scripts that is broken by the new syntax changes is MySQL-Sandbox. I have just released an updated version (MySQL Sandbox 3.0.48) with a workaround for MySQL 5.7.6 changed SET PASSWORD syntax.
BTW, mysql.user 테이블에 password 필드가 삭제되었다고 말했나요? 이것은 많은 테스트를 멈추게하는 또 다른 놀라운 점이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
mysql> USE mysql DATABASE changed mysql> SELECT host,USER,password FROM USER; ERROR 1054 (42S22): UNKNOWN COLUMN 'password' IN 'field list' mysql> SELECT host, USER, authentication_string FROM USER; +-----------+-------------+-------------------------------------------+ | host | USER | authentication_string | +-----------+-------------+-------------------------------------------+ | localhost | root | *6C387FC3893DBA1E3BA155E74754DA6682D04747 | | 127.% | msandbox | *6C387FC3893DBA1E3BA155E74754DA6682D04747 | | localhost | msandbox | *6C387FC3893DBA1E3BA155E74754DA6682D04747 | | localhost | msandbox_rw | *6C387FC3893DBA1E3BA155E74754DA6682D04747 | | 127.% | msandbox_rw | *6C387FC3893DBA1E3BA155E74754DA6682D04747 | | 127.% | msandbox_ro | *6C387FC3893DBA1E3BA155E74754DA6682D04747 | | localhost | msandbox_ro | *6C387FC3893DBA1E3BA155E74754DA6682D04747 | | 127.% | rsandbox | *B07EB15A2E7BD9620DAE47B194D5B9DBA14377AD | | % | testuser | *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 | +-----------+-------------+-------------------------------------------+ 9 ROWS IN SET (0.00 sec) |