MySQL安全与优化

服务器设置

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已经是行锁了,但还是要避免出现不同用户写同一记录的情况

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值