我目前正在尝试在 MySQL 上创建一个计划事件,以每周清除二进制日志。
create 事件语句如下:
CREATE EVENT purgebinlogs
ON SCHEDULE EVERY 1 WEEK
STARTS CONCAT(CURRENT_DATE + INTERVAL 7 - WEEKDAY(CURRENT_DATE) DAY,' 01:00:00')
DO
PURGE BINARY LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 7 DAY);
Run Code Online (Sandbox Code Playgroud)
它应该在每个星期一的 01:00 运行。但是,如果我查询 mysql.event 表,我会得到以下输出:
mysql> select * from mysql.event\G
*************************** 1. row ***************************
db: mysql
name: purgebinlogs
body: PURGE BINARY LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 7 DAY)
definer: root@localhost
execute_at: NULL
interval_value: 7
interval_field: WEEK
created: 2015-03-13 17:45:20
modified: 2015-03-13 17:51:43
last_executed: NULL
starts: 2015-03-16 07:00:00
ends: NULL
status: ENABLED
on_completion: DROP
sql_mode: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
comment:
originator: 1
time_zone: SYSTEM
character_set_client: cp850
collation_connection: cp850_general_ci
db_collation: utf8_general_ci
body_utf8: PURGE BINARY LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 7 DAY)
Run Code Online (Sandbox Code Playgroud)
如您所见,开始列说:
开始时间:2015-03-16 07:00:00
日期没问题,但时间...它应该在 01:00 而非 07:00 运行
我认为这可能是时区问题,因为我的时区是“-06:00”
mysql> show global variables like 'time_z%';
+------------------+----------+
| Variable_name | Value |
+------------------+----------+
| time_zone | -06:00 |
+------------------+----------+
2 rows in set, 1 warning (0.01 sec)
mysql> SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
+--------------------------------+
| TIMEDIFF(NOW(), UTC_TIMESTAMP) |
+--------------------------------+
| -06:00:00 |
+--------------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
但我无法猜测如何解决这个问题。我想在 01:00 运行预定的事件
编辑
查询 information_schema.events 时显示正确的信息
mysql> select * from information_schema.events\G
*************************** 1. row ***************************
EVENT_CATALOG: def
EVENT_SCHEMA: mysql
EVENT_NAME: purgebinlogs
DEFINER: root@localhost
TIME_ZONE: SYSTEM
EVENT_BODY: SQL
EVENT_DEFINITION: PURGE BINARY LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 7 DAY)
EVENT_TYPE: RECURRING
EXECUTE_AT: NULL
INTERVAL_VALUE: 1
INTERVAL_FIELD: WEEK
SQL_MODE: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
STARTS: 2015-03-16 01:00:00
ENDS: NULL
STATUS: ENABLED
ON_COMPLETION: NOT PRESERVE
CREATED: 2015-03-13 17:45:20
LAST_ALTERED: 2015-03-13 17:56:32
LAST_EXECUTED: NULL
EVENT_COMMENT:
ORIGINATOR: 1
CHARACTER_SET_CLIENT: cp850
COLLATION_CONNECTION: cp850_general_ci
DATABASE_COLLATION: utf8_general_ci
Run Code Online (Sandbox Code Playgroud)
所以我猜 mysql.event 在 UTC 时间而不是在本地 TimeZone 中显示信息
编辑
正如@Rick James 所建议的,我使用以下命令动态更改了 expire_logs_days 的值:
set global expire_logs_days=7
Run Code Online (Sandbox Code Playgroud)
但似乎它不起作用......
mysql> show global variables like 'expire%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| expire_logs_days | 7 |
+------------------+-------+
Run Code Online (Sandbox Code Playgroud)
但是,如果我列出 binlog 文件,我会得到以下列表:
Mar 5 19:30 mysql56_bin.000001
Mar 5 19:30 mysql56_bin.000002
Mar 10 13:53 mysql56_bin.000003
Mar 11 11:59 mysql56_bin.000004
Mar 11 17:44 mysql56_bin.000005
Mar 12 12:53 mysql56_bin.000006
Mar 12 12:58 mysql56_bin.000007
Mar 12 13:02 mysql56_bin.000008
Mar 12 13:07 mysql56_bin.000009
Mar 12 13:12 mysql56_bin.000010
Mar 12 13:16 mysql56_bin.000011
Mar 12 13:20 mysql56_bin.000012
Mar 12 13:24 mysql56_bin.000013
Mar 17 10:38 mysql56_bin.000014
Mar 17 18:27 mysql56_bin.000015
Mar 17 18:28 mysql56_bin.000016
Mar 17 18:28 mysql56_bin.index
Run Code Online (Sandbox Code Playgroud)
如您所见,有一周前的二进制日志。
| 归档时间: |
|
| 查看次数: |
18981 次 |
| 最近记录: |