mysql二进制文件操作语法(mysql binary log operate statements)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 开启 binary logs 功能在 mysql 配置文件中配置 log-bin,重启 mysqlmy.cnf (on Linux/unix) or my.ini (on Windows) 例子:[client]...[mysqld]...log-bin=mysql-bin (log_bin=/var/mydb/bin-log,指定 log 的路径,以及名称前缀)---一旦重启,Mysql 会自动创建新的二进制文件。

开启 binary logs 功能

在 mysql 配置文件中配置 log-bin,重启 mysql
my.cnf (on Linux/unix) or my.ini (on Windows) 例子:

[client]
...

[mysqld]
...
log-bin=mysql-bin  (log_bin=/var/mydb/bin-log,指定 log 的路径,以及名称前缀)
---

一旦重启,Mysql 会自动创建新的二进制文件。您也不妨看看下面的变量

server-id        = 1
expire_logs_days = 4 (自动删除 log 的天数,缺省值为 0,即不自动删除)
sync_binlog      = 1

详细信息可以阅读 MySQL documentation,如果你使用主从库(使用二进制文件的主要理由),请查阅Replication configuration checklist

查看 binary logs

登陆 MySQL 之后执行如下语句:

SHOW BINARY LOGS
等价
SHOW MASTER LOGS

返回值:

mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |        98 |
+------------------+-----------+
1 row in set (0.00 sec)

手动删除 binary log

PURGE { BINARY | MASTER } LOGS
    { TO 'log_name' | BEFORE datetime_expr }

例子:

PURGE BINARY LOGS TO 'mysql-bin.010';
PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26';

datetime_expr 参数格式为 YYYY-MM-DD hh:mm:ss
上述语法,当从库正在同步时,也可以安全运行。你不必要关闭从库。如果你正在删除一个从库正在同步的 log,上述语句将不会做任何操作。MySQL 5.7.2 以及之后版本将会报错。然而,如果你删除了一个从库没有同步的 log,那么从库将无法与主库保持数据一致。
手动安全删除日志的步骤:

  • 在每一个从库的 MySQL 上运行 SHOW SLAVE STATUS,检验从库没有从主库读取日志
  • 使用命令 SHOW BINARY LOGS,查看主库上的 binary log 文件
  • 找出在从库中时间最早的 log 文件,这是我们要删除的目标文件。如果所有从库都对同一个 log 与主库保持同步,那么那个日志就是我们要删除的目标文件
  • 删除之前,备份 log。(这一步是可选的,但是建议你这么做)
  • 删除目标文件之前的 log

可以通过设置 expire_logs_days 参数,自动删除 log。
在调用上述删除语句之前,log 已经被删除,比如 linux 中使用 rm 命令,那么该语句将会报错。

binary log 格式

binary log 会记录所有与数据修改相关的操作,查询不会被记录哦。
比如我有如下的一些操作:

1. drop table student_information;
2. drop table student;
3. CREATE TABLE `student` (
     `id` int(11) NOT NULL AUTO_INCREMENT,
     `name` char(20) NOT NULL,
     `age` tinyint(2) NOT NULL DEFAULT '0',
     PRIMARY KEY (`id`),
     KEY `index_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
4. insert student values(1,'zhangsan',20);
5. insert student values(1,'zhangsan',20);
6. insert student values(3,'wangwu',22);

通过命令将 binary log 转为 SQL 脚本:

mysqlbinlog mysql-bin.000001 > my.sql

binary log 存储内容为:

SET TIMESTAMP=1473842609/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1/*!*/;
SET @@session.sql_mode=1344274432/*!*/;
/*!\C latin1 *//*!*/;
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/;
drop table student_information
/*!*/;
# at 193
#160914 16:43:35 server id 1  end_log_pos 276   Query   thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1473842615/*!*/;
drop table student
/*!*/;
# at 276
#160914 16:43:57 server id 1  end_log_pos 578   Query   thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1473842637/*!*/;
CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  `age` tinyint(2) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `index_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8
/*!*/;
# at 578
#160914 16:44:11 server id 1  end_log_pos 648   Query   thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1473842651/*!*/;
BEGIN
/*!*/;
# at 648
#160914 16:44:11 server id 1  end_log_pos 751   Query   thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1473842651/*!*/;
insert student values(1,'zhangsan',20)
/*!*/;
# at 751
#160914 16:44:11 server id 1  end_log_pos 778   Xid = 29
COMMIT/*!*/;
# at 778
#160914 16:44:19 server id 1  end_log_pos 848   Query   thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1473842659/*!*/;
BEGIN
/*!*/;
# at 848
#160914 16:44:19 server id 1  end_log_pos 947   Query   thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1473842659/*!*/;
insert student values(2,'lisi',21)
/*!*/;
# at 947
#160914 16:44:19 server id 1  end_log_pos 974   Xid = 30
COMMIT/*!*/;
# at 974
#160914 16:44:25 server id 1  end_log_pos 1044  Query   thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1473842665/*!*/;
BEGIN
/*!*/;
# at 1044
#160914 16:44:25 server id 1  end_log_pos 1145  Query   thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1473842665/*!*/;
insert student values(3,'wangwu',22)
/*!*/;
# at 1145
#160914 16:44:25 server id 1  end_log_pos 1172  Xid = 31
COMMIT/*!*/;
# at 1172
#160914 17:31:33 server id 1  end_log_pos 1242  Query   thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1473845493/*!*/;
BEGIN
/*!*/;
# at 1242
#160914 17:31:33 server id 1  end_log_pos 1348  Query   thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1473845493/*!*/;
update student set age = 100 where id = 1
/*!*/;
# at 1348
#160914 17:31:33 server id 1  end_log_pos 1375  Xid = 33
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

从语法上可以看出,如果是 update 操作恢复的概率相对要麻烦很多,需要对比操作。 SET TIMESTAMP 是操作的时间戳,这个相当有用,这样就允许我们通过时间来确定重做的范围。delete 以及 update 都被放置在事务里边了,但是只有当整个 binary log 执行完成才算成功,任何一条语法的异常都会导致事务回滚,重做失败。

使用 binary log 增量恢复数据

直接重做 binary log 中的操作:

mysqlbinlog mysql-bin.000001 | mysql -u root -p

执行过程中发生异常就被被终止,所以在重做之前需要自己处理该文件,使得重做的动作是自己想要的。比如从上述 binary log 中有 drop table student_information 操作,而此时的数据库中已经不存在该表,所以重做该步骤就会抛出异常信息。ERROR 1051 (42S02) at line 16: Unknown table 'student_information'

逐行查看 binary log 中内容:

mysqlbinlog mysql-bin.000001 | more

转换 binary log 为 SQL 脚本:

mysqlbinlog mysql-bin.000001 > my.sql

重做 SQL 脚本:

mysql -u root -p < my.sql

如果你有多个 binary log 文件需要被执行,安全的方式是:将所有的 binary log 一次性执行。不安全方法的示例:

mysqlbinlog binlog.000001 | mysql -u root -p # DANGER!!
mysqlbinlog binlog.000002 | mysql -u root -p # DANGER!!

使用两个不同连接处理 binary log 可能导致问题,有可能会发生如下情况:第一个 binary log 包含语法 CREATE TEMPOARY TEBLE 而第二个 binary log 使用到该临时表。当第一个 binary log 执行完成将会删除临时表,那么第二个 binary log 需要使用到该临时表的语句将报错。

在一个连接中完成 binary logs 的处理,例子如下:

mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p

另外一种方法,将 binary logs 合并为一个 SQL 脚本:

mysqlbinlog binlog.000001 >  /tmp/statements.sql
mysqlbinlog binlog.000002 >> /tmp/statements.sql
mysql -u root -p -e "source /tmp/statements.sql"

When writing to a dump file while reading back from a binary log containing GTIDs (see Section 18.1.3, “Replication with Global Transaction Identifiers”), use the --skip-gtids option with mysqlbinlog, like this:

mysqlbinlog --skip-gtids binlog.000001 >  /tmp/dump.sql
mysqlbinlog --skip-gtids binlog.000002 >> /tmp/dump.sql
mysql -u root -p -e "source /tmp/dump.sql"

欢迎转载,但请注明本文链接,谢谢你。
2016.9.14 19:08

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
SQL 自然语言处理 关系型数据库
MySQL的match匹配多个字符串的语法
【8月更文挑战第27天】MySQL的match匹配多个字符串的语法
182 67
|
2天前
|
关系型数据库 MySQL 数据库
MySQL的语法涵盖了数据定义、数据操作、数据查询和数据控制等多个方面
MySQL的语法涵盖了数据定义、数据操作、数据查询和数据控制等多个方面
13 5
|
2天前
|
关系型数据库 MySQL 数据库
MySQL的语法知识
MySQL的语法知识
11 4
|
3天前
|
SQL 关系型数据库 MySQL
MySQL语法
MySQL语法
12 3
|
12天前
|
关系型数据库 MySQL 数据库
MYSQL索引的分类与创建语法详解
理解并合理应用这些索引类型,能够有效提高MySQL数据库的性能和查询效率。每种索引类型都有其特定的优势,适当地使用它们可以为数据库操作带来显著的性能提升。
33 3
|
21天前
|
SQL 关系型数据库 MySQL
mysql的语法
mysql的语法
26 1
|
2月前
|
SQL 自然语言处理 关系型数据库
MySQL的match匹配多个字符串的语法
【8月更文挑战第29天】MySQL的match匹配多个字符串的语法
51 2
|
2月前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
67 0
|
2月前
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
64 0
下一篇
无影云桌面