服务器设置
l 拒绝外网对数据库服务器3306端口的访问,通过防火墙或路由器上设置,测试:telnet server_host 3306
l 添加专门用户执行启动数据库服务(不要用root,不然数据库用户就拥有了root用户的写权限);
只有该用户对MySQL目录文件有读和写的权限,因为类似grant语句也会记录在日志中
chown -R 用户名.用户组 /usr/local/mysql/var
chmod -R go-rwx /usr/local/mysql/var
l 本地登录MySQL进入命令行模式,不要在-p后直接加密码,这样会被shell记录在历史文件
l MySQL配置文件中值得关注的
n max_user_connections
限定数据库服务器的最大连接数,最好结合访问组件连接池使用
n wait_timeout
指定一个请求的最大连接时间,单位秒
n max_allowed_packet
一个查询语句包的最大尺寸 如4M
n query_cache_size
指定MySQL查询缓冲区的大小 如64M
n sort_buffer_size
一个连接查询排序时所能使用的缓冲区大小 如512K
n join_buffer_size
一个连接联合查询操作所能使用的缓冲区大小 如512K
n thread_concurrency
服务器逻辑CPU数量×2
n thread_cache_size
保存在线程缓存中的线程的数量.内存G*8即2G设为16
n default-storage-engine
新数据表的默认数据表类型 如InnoDB
n lower_case_table_names
1:不区分大小写
n slow_query_log_file=/var/lib/mysql/mysql_slow.log
慢查询log文件,查看通过showvariables like '%slow_query_log%'
n long-query-time
慢查询的时间界定,单位秒
n log-queries-not-using-indexes
记录没有使用索引的查询
INNODB环境变量
l innodb_buffer_pool_size
Innodb的缓冲池会缓存数据和索引,建议把这个值设为内存的50%-80%。
l innodb_log_buffer_size = 8M
日志缓存的大小,如果负载较大就应该加大这个值。8-16M即可。
l innodb_log_file_size
log文件组每个文件的大小,默认8M,大可以节省I/O,建议256M
l innodb_log_files_in_group
log文件组的log文件数量,推荐使用3
l innodb_file_io_threads
I/O操作的最大线程个数,默认是4
l innodb_thread_concurrency = 16
InnoDB驱动程序同时使用的最大线程个数,默认是8
l innodb_flush_log_at_trx_commit
n 0:更快一点,每秒写一次日志,并刷新硬盘,不安全,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失。
n 1:默认值,每一次事务提交或语句执行都写日志,并刷新硬盘
n 2:每一次事务提交或语句执行都写日志,每秒刷新硬盘。整个操作系统崩溃会导致上一秒钟所有事务数据的丢失。
l innodb_flush_method:
设置InnoDB同步IO的方式,正常过程:打开文件--写文件缓存--flush disk
n fdatasync:默认值 安全的,因为在MySQL总会调用fsync来flush数据
n O_DSYNC 以sync模式打开文件,不但硬盘写入完成,而且文件属性(例如文件长度等)更新完成才算成功,通常比较慢。
n O_DIRECT,使用Direct IO,不用cache,可以显著提高速度,但降低文件的顺序读写的效率。
l innodb_lock_wait_timeout
事务被锁的 超时设置,默认50s
用户权限
l 必须修改root密码
UPDATE user set password = PASSWORD(‘***’)where user=’root’;
对user表操作以后不要忘了用flush privileges来强制刷新内存授权表,这样才能生效
l 初始生成的匿名用户必须删除 delete from user where user = ‘’;
l 除了root用户外,其他用户不应该拥有grant权限,防止管理权限不受控制的扩散出去
l user表中避免使用通配符,如host必须记录IP,比如%允许任意的主机连接MySQL服务器
l 具体应用专门建用户,赋予update,delete,alert,create,drop权限,结合db限定到特定的数据库,特别避免对mysql库的权限
l 检查user表中process,super,file权限
n process可以查看当前执行的查询文本
n super可以切断客户端连接、改变服务器运行参数等
n file可以load data'/etc/passwd'到表中再用select
l 检查user表中shutdown_priv,reload_priv,process_priv和File_priv权限,防止对服务器的操作
编程
l 原则是永远不要相信用户提交的数据
n 提交的数字字段,组织查询语句时加上单引号,如where id = ‘×××’,MySQL会自动把字串转换为数字字符并且去除非数字字符。
n 提交的字符串字段,进行长度检查,特殊字符转义,如PHP中的mysql_escape_string
l innodb已经是行锁了,但还是要避免出现不同用户写同一记录的情况