MIN CHO
MIN CHO

Categories

Tags

mysql client utility 와 -A 옵션

mysql client utility 는 기본적으로 데이터베이스를 use 하는 순간, 해당 database의 테이블을 비롯하여 컬럼까지 읽어들여 캐시에 저장한 후 자동완성 기능을 제공한다. - http://dev.mysql.com/doc/refman/5.6/en/mysql-command-options.html#option_mysql_auto-rehash 이를 막고자, 접속시에 –no-auto-rehash 옵션을 두거나, -A 옵션을 사용할 수 있다. - http://dev.mysql.com/doc/refman/5.6/en/mysql-command-options.html#option_mysql_no-auto-rehash 이때문에 간편하기도 하지만 테이블이 많아진다면, mysql client에서 use database; 시에 몇 초동안이나 기다려야 할 수도 있다. 서버가 바쁜경우는 더욱 오래걸린다. 아래는 간단한 예제이다.

---- #no-auto-rehash (해당 옵션을 사용하지 않은 경우)
    [root@testvm2 db]# m
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 34983
    Server version: 5.6.19-log MySQL Community Server (GPL)

    Copyright (c) 2000, 2014, 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.

    root@localhost:(none) 17:00:48>use test
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A       <---- 익숙한 메세지지만, 내용인 즉 -A 를 사용해서 자동완성기능을 끌 수 있다는 것이다.

    Database changed
    root@localhost:test 17:00:55>      <-- tab을 두번 연속으로 누르게 된다면, mysql client tool 에서 실행할 수 있는 모든 명령어 및 table, column 들에 대한 정보들를 볼 수 있다.
    Display all 11054 possibilities? (y or n)  <--- table 이 100개 정도 되니.. 어마어마한 숫자가 캐시되었다.


---- no-auto-rehash (해당 옵션을 사용한 경우)
    [root@testvm2 db]# /db/5.6/bin/mysql -uroot
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 357
    Server version: 5.6.19-log MySQL Community Server (GPL)

    Copyright (c) 2000, 2014, 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.

    root@localhost:(none) 17:07:07>use test
    Database changed
    root@localhost:test 17:07:10>       <-- tab을 눌러도 아무런 변화가 없습니다.

이와 같이 굳이 자동완성기능을 사용하지 않는경우, -A 옵션을 주는 것이 일반적이다. 또한 사용되지도 않을 테이블들을 모두 열어야 하기 때문에 서버가 바쁜경우라면 더욱 문제가 될 수 있다. 장애로 이어질 수도… 아래의 예제를 확인해보자

---- no-auto-rehash
    root@localhost:test 17:08:48>show open tables;
    ...
    70 rows in set (0.00 sec)

    root@localhost:test 17:08:51> use test;
    Database changed

    root@localhost:test 17:08:55>show open tables;
    ...
    70 rows in set (0.00 sec) <-- 여전히 처음 시작할때의 70 개의 table 만을 열고 있다.


---- #no-auto-rehash
    root@localhost:(none) 17:10:53>show open tables;
    ...
    70 rows in set (0.01 sec)

    root@localhost:(none) 17:10:55> use test;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A

    Database changed
    root@localhost:test 17:11:02>show open tables;
    ...
    861 rows in set (0.02 sec) <-- 대략 800개의 테이블을 추가로 열었다.

    test database 의 모든 테이블을 열었다. 이는 엄청난 오버헤드를 발생시킨다.
        - http://dev.mysql.com/doc/refman/5.7/en/table-cache.html

혹은 범용적으로 사용될 수 있는 my.cnf 인 /etc/my.cnf 의 [mysql] 항목에 아래와 같이 명시하여, mysql client 가 실행될때 아래의 옵션에 따라 실행될 수 있도록 조절할 수 있다. 이 경우에는 굳이 -A 옵션을 주지 않아도 자동으로 비활성화 된다.

[mysql]
no-auto-rehash
show-warnings
prompt=u@h:d_R:m:\s>

추가로 show-warnings 는 warning 이 발생하였을시, show warnings 로 확인하는 것이 아닌 바로 warning을 볼 수 있게 해주는 옵션이다 show warnings 를 치기 귀찮은 사람은 강추. prompt 옵션은 mysql> 대신 좀 더 유익한 정보를 찍어주는 옵션이다. 현재 접속된 host 및 database, 시간등…