日志类型
①事务日志:用于存储记录数据库事务的相关内容,默认开启。
②错误日志:用于存储记录数据库出现错误,yum安装默认位置:/var/log/mysql.log,默认开启。
③慢查询日志:用于存储记录数据库具体些语句执行时较慢,默认关闭。
④通用日志:记录对数据库的通用操作,包括错误的sql语句,默认是关闭。
⑤二进制日志:二进制方式记录数据库所有操作可用于备份恢复数据,默认关闭。
⑥中继日志:主从复制架构中,从服务器用于保存主传输过来的二进制日志文件。
错误日志
错误日志,用来记录当MySQL启动、停止或运行时发生的错误信息,默认已开启。
SHOW GLOBAL VARIABLES LIKE 'log_error' ;
vim /etc/my.cnf
[mysqld]
log-error=mysql_error.log #编译安装指定日志的保存位置
log-error=/var/log/mysql_error.log #yum安装的默认错误日志位置
二进制日志
二进制日志(binlog),用来记录所有更新了数据或者已经潜在更新了数据的语句,记录了数据的更改,可用于数据恢复,默认已开启。
show variables like 'binlog_format'; 查看格式
show variables like 'log_bin%'; 查看相关变量
vim /etc/my.cnf
[mysqld]
server-id=1 #5.7及以上版本的话,不加server-id重启mysql服务会报错,5.7以下版本就不用加了
log-bin=mysql-bin #也可以log_bin=mysql-bin #没有默认位置 需要手动指定
#使用相对路径,则文
binlog_format = MIXED
使用mysql的功能少(不用存储过程,触发器,函数),选择默认的statement
用到特殊功能(存储过程,触发器,函数)则选择mixed
用到特殊功能希望数据最大化一致选择row
mysql-bin.index 文件会对二进制日志进行分割。
每次重启 mysql 或 在数据库中 "flush logs"刷新日志之后,会生成一个新的二进制日志。
通用查询日志
通用查询日志,用来记录MySQL的所有连接和语句,默认是关闭的。
默认位置 general_log_file=HOSTNAME.log 相对路径安装目录下
vim /etc/my.cnf
[mysqld]
general_log=ON #默认关闭 手动开启
general_log_file=指定位置
set global general_log=1; #开启
SHOW GLOBAL VARIABLES LIKE 'log_output';
#默认通用日志存放在文件中
show variables like 'general%';
#通用日志存放的文件路径
慢查询日志
慢查询日志,用来记录所有执行时间超过long_query_time秒的语句,可以找到哪些查询语句执行时间长,以便于优化,默认是关闭的。
默认位置 slow_query_log_file=HOSTNAME-slow.log 相对路径安装目录下
show variables like '%slow%'; 确认日志
show variables like 'long_query_time%';
vim /etc/my.cnf
[mysqld]
slow_query_log=ON
slow_query_log_file=
long_query_time=5 #慢查询时间,设置超过5秒执行的语句被记录,缺省时为10秒
set global slow_query_log=1;
#开启
set long_query_time=1;
事务日志
innodb事务日志包括redo log和undo log。
redo log是重做日志,提供前滚操作,
undo log是日志,提供回滚操作
1.redo log通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。
2.undo用来回滚行记录到某个版本。undo log一般是逻辑日志,根据每行记录进行记录
事务型存储引擎自行管理和使用,建议和数据文件分开存放
事务日志和二进制日志的区别
事务日志记录的是物理页的情况,它具有幂等性,因此记录日志的方式极其简练。幂等性的意思是多次操作前后状态是一样的,例如新插入一行后又删除该行,前后状态没有变化。而二进制日志记录的是所有影响数据的操作,记录的内容较多。例如插入一行记录一次,删除该行又记录一次。
show variables like '%innodb_log%';
vim /etc/my.cnf
innodb_flush_log_at_trx_commit=0|1|2
innodb_log_group_home_dir ./ #事务文件路径
innodb_log_file_size 50331648 #调整每个日志文件大小字节,默认约50M
innodb_log_files_in_group 2 #日志分隔个数,默认2个
select @@innodb_flush_log_at_trx_commit;
#查看默认值
1 此为默认值,日志缓冲区将写入日志文件,并在每次事务后执行刷新到磁盘。 这是完全遵守ACID特性
0 提交时没有写磁盘的操作; 而是每秒执行一次将日志缓冲区的提交的事务写入刷新到磁盘。 这样可提供更好的性能,但服务器崩溃可能丢失最后一秒的事务
2 每次提交后都会写入OS的缓冲区,但每秒才会进行一次刷新到磁盘文件中。 性能比0略差一些,但操作系统或停电可能导致最后一秒的交易丢失
如果你的应用不涉及很高的安全性 (金融系统),或者基础架构足够安全,或者 事务都很小,都可以用 0 或者 2 来降低磁盘操作。
重启服务
systemctl restart mysqld
mysql优化
硬件上优化
cpu:推荐4U的服务器做数据库服务器
内存:推荐使用4GB以上物理内存
磁盘:磁盘IO是制约mysql性能的最大因素之一,通常使用raid01磁盘阵列。成本够的话使用固态硬盘
修改配置文件
双1优化
sync_binlog=1 mysql在每写一次二进制日志都会同步到磁盘中
innodb_flush_log_at_trx_commit=1 每次提交事务mysql都会缓存的数据写入日志文件,并刷到磁盘中去
其他参数优化
max_connections=5000 mysql允许最大的进程连接数 最大可设置16384
max_allowed_packet=32M 设置在网络传输中一次消息传输量的最大值,系统默认值为1MB
增加tcp连接队列数
使用足够大的写入缓存 innodb_log_file_size
但是需要注意如果用 1G 的 innodb_log_file_size ,假如服务器当机,需要 10 分钟来恢复。
推荐 innodb_log_file_size 设置为 0.25 * innodb_buffer_pool_size
架构:主从复制,读写分离,负载均衡。
使用索引:
经常与其他表进行连接的表,在连接字段上应该建立索引 经常出现在where 子句中的字段,特别是大表的字段,应该建立索引 索引应该建在选择性高的字段上 索引应该建在小字段上
不适合创建索引的字段 唯一性太差的字段不适合建立索引;即重复率过高 更新太频繁地字段不适合创建索引 大的文本字段甚至超长字段,不要建立索引
开启慢查询日志的使用
安全优化
避免外网访问mysql,确保特定主机才能访问
禁用或限制远程访问
my.cnf文件里设置bind-address指定ip
定期备份
移除test数据库,默认匿名用户可以访问test数据库
移除匿名用户和废气用户
限制mysql用户权限
移除 .mysql_history文件
数据库读取慢
增加服务器数量或者增强数据库服务器性能
慢查询日志找出执行慢的语句
explain分析索引