MySQL数据库或日志中时间差8个小时的解决方式及慢查询配置

时间异常

日期差8个小时有两种情况

  • 日志中比实际早8个小时
  • 数据库中日期比实际早8个小时

查看系统时区

首先先保证系统的时区是正确的。

在Linux系统中,你可以使用以下命令来查看当前系统时区:

1
timedatectl

确保时区正确

image-20231016094919761

如果需要更改系统时区,你可以使用以下命令:

1
sudo timedatectl set-timezone Asia/Shanghai

日志中时间异常

在MySQL中设置了慢查询日志,但是日志中的时间都慢了8小时,怀疑是时区的问题。

慢查询日志差8个小时

1
show variables like '%log_time%';

需要在MySQL的配置文件my.cnf中添加以下行:

1
2
[mysqld]
log_timestamps=SYSTEM

更改了时区设置后,可能需要重新启动MySQL服务才能使更改生效。

1
service mysqld restart

数据库中时间异常

查询当前时间

1
select now();

如果获取的时间正确,则无需修改,如果不对的化进行如下修改。

确保MySQL服务器的时区设置正确。

你可以使用以下SQL语句来查看当前时区设置:

1
SELECT @@global.time_zone, @@session.time_zone;

结果

image-20230925112253153

注意

默认是使用系统的时区,如果系统的时区设置时没有问题的则无需修改。

如果不想修改系统的时区,只修改MYSQL服务的时区,可以使用以下命令来更改它:

1
2
SET GLOBAL time_zone = '+08:00';
SET time_zone = '+08:00';

这时再查看

image-20230925114552258

如需要注意的是,以上修改时区的操作只对当前会话有效。

果您需要在全局范围内修改默认时区,需要在MySQL的配置文件my.cnf中添加以下行:

1
2
[mysqld]
default_time_zone = "+08:00"

更改了时区设置后,可能需要重新启动MySQL服务才能使更改生效。

1
service mysqld restart

慢查询配置

查询Mysql版本

1
select version();

或者

1
mysql --version

获取现在的配置

1
2
show variables like '%slow%';
show variables like 'long_query_time';

开启

1
2
set global long_query_time=3;
set global slow_query_log=1;

关闭

1
set global slow_query_log=0;

创建文件

1
2
3
4
cd /var/log/
mkdir mysql
cd mysql
vi mysql-slow.log

设置权限

1
chmod a+w /var/log/mysql/mysql-slow.log

打开配置文件

1
vi /etc/my.cnf

找到[mysqld]下面加上

1
2
3
slow_query_log = 1 
slow-query-log-file = /var/log/mysql/mysql-slow.log
long_query_time = 3

其中

long_query_time = 3中的3表示查询超过3秒才记录;

清空日志后慢查询就不会继续写入了,

要想在不重启数据库的前提下能写入,可以重新设置下变量才能继续写入

1
2
set global slow_query_log=0;
set global slow_query_log=1;

慢查询分析

1
mysqldumpslow /var/log/mysql/mysql-slow.log

结果会把出现的次数,总用时、平均用时都显示出来

image-20230925153337887

未使用索引日志

查看是否记录未使用索引的查询

1
show variables like 'log_queries_not_using_indexes';

配置

1
SET GLOBAL log_queries_not_using_indexes=1

在完成设置后,请使用命令

1
FLUSH LOGS;

刷新MySQL日志,以便将更改保存到磁盘上的日志文件中。

注意

未使用索引的日志建议关闭,因为无论查询时间多长的sql,都会记录在日志中。

这个配置和慢查询的配置是并集的关系,即如果两个都开启,所有的慢查询和未使用索引的SQL都将会被记录。

关闭

1
SET GLOBAL log_queries_not_using_indexes=0