常见问题及解决方法
1. localhost作为连接参数
    $ mysql --host=localhost,默认使用unix socket而非tcp
    使用ssh通道连接tcp端口必须使用127.0.0.1
    登陆时不会将localhost与%匹配
2. 临时表
    只有CREATE TEMPORARY TABLE权限,其他的“表权限”应用到临时表
    可能会导致不能对临时表做ddl操作,但是赋予这些权限会影响正常表
    解决方法是建一个tmp的db,将权限赋予用户
3. 必须使用密码
    [client] section of my.cnf as follows:
    password
    mysql.user表中空串的密码是没有密码,而非密码为空串你
4. 考虑禁用匿名用户
    show  grants 可能不会显示所有权限
    mysql提供的mysql_secure_installation可以实现
5. 合理使用用户的host
    host应该用来区分where connect,而非what can do
    容易产生问题
6.     select允许show create table
7. 不要给一般用户授权mysql db中的权限
    他们可以自己修改了
    不要使用grant *.*
8. 小心授权SUPER
9. Mysql没有“可以使用所有db 除了”的权限
    好的命名可以解决
    mysql> GRANT ... ON `analysis%`.* TO 'analyst' ...;
    让用户只能使用其名称开头的db,如果db有下划线,需要转义
    mysql> GRANT ... ON `sunny\_%`.* TO 'sunny' ...;
10. 隐式权限
    show grants只显式授予的权限
    mysql默认安装,将test_开头的db权限授予任何人
    有可能还能建db,如果有以下两行
        mysql> SELECT * FROM mysql.db\G
        *************************** 1. row ***************************
                     Host: %
                       Db: test
                     User:
              Select_priv: Y
        *************************** 2. row ***************************
                 Host: %
                   Db: test\_%
                 User:
          Select_priv: Y
        ... omitted ...
    另外一种情况是,用户权限查找时精确的匹配隐藏模糊匹配,即使模糊匹配权限更高,隐藏风险是用户权限修改后,模糊匹配会生效
11. 过期权限
    表被删除,用户被赋予的表的权限没有删

操作系统安全
1. 不要使用特权用户启动mysql
2. 保持OS更新
3. 限制db host的登录
4. 生产测试分离
5. server审计
6. 使用chrooting, jails, zones, or virtual servers进一步隔离mysql

网络安全
1. 仅允许本机连接
    禁止tcp socket 但允许unix socket
    [mysqld]
    skip_networking
   
    允许tcp 但仅限于本机
    [mysqld]
    bind_address=127.0.0.1
2. tcp wrapper:再封一个中间层,定义访问规则

数据加密
1. 用户密码:MD%
    mysql> SELECT MD5('p4ssword'), ENCRYPT('p4ssword'), SHA1('p4ssword')\G
    *************************** 1. row ***************************
        MD5('p4ssword'): 93863810133ebebe6e4c6bbc2a6ce1e7
        ENCRYPT('p4ssword'): dDCjeBzIycENk
        SHA1('p4ssword'): fbb73ec5afd91d5b503ca11756e33d21a9045d9d
   
    INSERT INTO user_table (user, pass) VALUES ('user', MD5('p4ssword') )
    SELECT * FROM user_table  WHERE user = ? AND pass = MD5(?)
2. 文件系统加密

chroot环境