shell脚本批量导出MYSQL数据库日志/按照最近N天的形式导出二进制日志[连载之构建百万访问量电子商务网站]

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:
shell脚本批量导出MYSQL数据库日志/自动本地导出MYSQL二进制日志,按天备份[连载之构建百万访问量电子商务网站]
出处: http://jimmyli.blog.51cto.com/  我站在巨人肩膀上Jimmy Li
作者:Jimmy Li
关键词:网站,电子商务,Shell,自动备份,异地备份
------[连载之电子商务系统架构]访问量超过100万的电子商务网站技术架构
连接:
http://jimmyli.blog.51cto.com/3190309/676378  访问量超过100万的电子商务网站技术架构
 
mysqlbinlog
从二进制日志读取语句的工具。在二进制日志文件中包含的执行过的语句的日志可用来帮助从崩溃中恢复。
 
一、MYSQL数据库日志,有以下几种日志:
1.错误日志: -log-error
2.查询日志: -log
3.慢查询日志: -log-slow-queries
4.更新日志: -log-update
5.二进制日志: -log-bin
这里讨论的是MYSQL二进制日志的导出、导入;MYSQL二进制日志完整备份,增量备份。
默认情况下,所有日志创建于mysqld数据目录中,或者手工指定/etc/my.cnf [mysqld] 设置段的选项设置。
在linux下:
# 在[mysqld] 中輸入
Python
  1. [mysqld]
  2. log_long_format
  3. log-bin = /data/mysql/3306/binlog
  4. binlog_cache_size = 4M
  5. binlog_format = MIXED
  6. max_binlog_cache_size = 16M
  7. max_binlog_size = 512M
  8. expire_logs_days = 30
  9.  

 
以上,开启MYSQL的二进制日志,并指定保存日志的路径。
 
binlog日志打开方法
在my.cnf这个文件中加一行(Windows为my.ini)。

[mysqld] 
log-bin=mysqlbin-log #添加这一行就ok了=号后面的名字自己定义吧 
然后我们可以对数据库做简单的操作后到mysql数据文件所在的目录来看binlog文件 

[root@jimmyli mysql]# ll 
-rw-rw---- 1 mysql mysql 813255 Nov 25 18:14 mysqlbin-log.000001 
看到这个类似的文件,证明搞定了。

二、查看二进制日志文件用mysqlbinlog命令
是否启用了日志
mysql>show variables like 'log_%';
怎样知道当前的日志
mysql> show master status;
显示二進制日志数目
mysql> show master logs;
看二进制日志文件用mysqlbinlog
shell>mysqlbinlog mail-bin.000001
或者shell>mysqlbinlog mail-bin.000001 | tail 9000
查看二进制日志文件最后(倒数)9000行的SQL日志记录

三、shell脚本批量导出MYSQL数据库日志
按照最近N天的形式导出二进制日志
上面的设置中,MYSQL二进制日志保存了30天,mail-bin.000001类似文件保存的大小为512M。根据网站的运营需要,需要将MYSQL二进制日志完整备份,增量备份,按照最近N天的形式导出日志文件,以TXT文件保存。
shell
  1. shell代码如下:
  2. #!/bin/bash
  3. iday=60 #循环导出60天的mysqlbinlog日志
  4. startday=$(date -d "-$iday day" +"%y-%m-%d")
  5. stopday=$(date +"%y-%m-%d")
  6. # while [ "$startday" != "$stopday" ]
  7. while [ $iday -ge 1 ]
  8. #while (("$iday" >= 1))
  9. do
  10. echo $iday
  11. startday=$(date -d "-$iday day" +"%y-%m-%d")
  12. echo startday=$startday
  13. echo stopday=$stopday
  14. ./mysqlbinlog --start-datetime="$startday 00:00:00" --stop-datetim="$startday 23:59:59" binlog.*[0-9] > $startday.txt
  15. echo ---------------
  16. iday=`expr $iday - 1`
  17. done
  18. 执行结果如下
  19. [root@JimmyLi bin]# ./test.sh
  20. 60
  21. startday=12-04-17
  22. stopday=12-06-16
  23. ---------------
  24. #中间忽略#
  25. 1
  26. startday=12-06-15
  27. stopday=12-06-16
  28. ---------------
  29.  

 
 
从12-04-17.txt到12-06-15.txt共60天的日志,以天为单位,每一个日期生成当天的mysqlbinlog日志。

四、自动本地导出MYSQL二进制日志,按天备份
 
可以将mysqlbinlog的输出传到mysql客户端以执行包含在二进制日志中的语句。如果你有一个旧的备份,该选项在崩溃恢复时也很有用:
shell> mysqlbinlog hostname-bin.000001 | mysql
或:
shell> mysqlbinlog hostname-bin.[0-9]* | mysql
shell> mysqlbinlog hostname-bin.*[0-9] > bin.txt
如果你需要先修改含语句的日志,还可以将mysqlbinlog的输出重新指向一个文本文件。
(例如,想删除由于某种原因而不想执行的语句)。编辑好文件后,将它输入到mysql程序并执行它包含的语句。
自动本地导出MYSQL二进制日志,按天备份命令:
shell>./mysqlbinlog --start-datetime="12-06-16 00:00:00" --stop-datetim="12-06-16 23:59:59" binlog.*[0-9] > 12-06-16.txt

五、讨论如果MySQL服务器上有多个要执行的二进制日志,安全的处理方法。
mysqlbinlog有一个--position选项,只打印那些在二进制日志中的偏移量大于或等于某个给定位置的语句(给出的位置必须匹配一个事件的开始)。
它还有在看见给定日期和时间的事件后停止或启动的选项。这样可以使用--stop-datetime选项进行点对点恢复(例如,能够说“将数据库前滚动到今天10:30 AM的位置”)。

如果MySQL服务器上有多个要执行的二进制日志,安全的方法是在一个连接中处理它们。下面是一个说明什么是不安全的例子:
shell> mysqlbinlog hostname-bin.000001 | mysql -u root
shell> mysqlbinlog hostname-bin.000002 | mysql -u root
使用与服务器的不同连接来处理二进制日志时,如果第1个日志文件包含一个CREATE TEMPORARY TABLE语句,第2个日志包含一个使用该临时表的语句,则会造成问题。当第1个mysql进程结束时,服务器撤销临时表。当第2个mysql进程想使用该表时,服务器报告 “不知道该表”。
要想避免此类问题,使用一个连接来执行想要处理的所有二进制日志中的内容。下面提供了一种方法:
shell> mysqlbinlog hostname-bin.000001 hostname-bin.000002 | mysql
另一个方法是:
shell> mysqlbinlog hostname-bin.000001 >  /tmp/statements.sql
shell> mysqlbinlog hostname-bin.000002 >> /tmp/statements.sql
shell> mysql -e "source /tmp/statements.sql"
mysqlbinlog产生的输出可以不需要原数据文件即可重新生成一个LOAD DATA INFILE操作。mysqlbinlog将数据复制到一个临时文件并写一个引用该文件的LOAD DATA LOCAL INFILE语句。由系统确定写入这些文件的目录的默认位置。要想显式指定一个目录,使用--local-load选项。
因为mysqlbinlog可以将LOAD DATA INFILE语句转换为LOAD DATA LOCAL INFILE语句(也就是说,它添加了LOCAL),用于处理语句的客户端和服务器必须配置为允许LOCAL操作。
警告:为LOAD DATA LOCAL语句创建的临时文件不会自动删除,因为在实际执行完那些语句前需要它们。不再需要语句日志后应自己删除临时文件。文件位于临时文件目录中,文件名类似original_file_name-#-#。

六、其他查看MYSQL日志的相关命令
1. 查看自己的BINLOG的名字是什么
命令:show binary logs;
mysql> show binary logs;
+---------------+-----------+
| Log_name      | File_size |
+---------------+-----------+
| binlog.000044 | 471894871 |
| binlog.000045 |    267061 |
+---------------+-----------+
2 rows in set (0.00 sec)
以后每次对表的相关操作时候,这个File_size都会增大。

2. 做了几次操作后,它就记录了下来。
命令:show binlog events

3. 用mysqlbinlog 工具来显示记录的二进制结果,然后导入到文本文件,为了以后的恢复。
详细过程如下:
C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqlbinlog --start-position=4 --sto
p-position=106 mysqlbin-log.000001 > c:\\test1.txt
或者全部导出:
C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqlbinlog mysqlbin-log.000001 > c:\\test1.txt

4. 导入结果到MYSQL中进行数据恢复。
C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqlbinlog --start-position=134 --stop-position=330 mysqlbin-log.000001 | mysql -uroot -p
或者
C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqlbinlog --start-position=134 --stop-position=330 mysqlbin-log.000001 >test1.txt
进入MYSQL导入
mysql> source c:\\test1.txt
还有一种办法是根据日期来恢复
C:\Program Files\MySQL\MySQL Server 5.0\bin >mysqlbinlog --start-datetime="2009-09-14 0:20:00" --stop-datetim="2009-09-15 01:25:00" /diskb/bin-logs/xxx_db-bin.000001 | mysql -u root
5、查看数据
Select * from User
6、其他MYSQL日志命令
是否启用了日志
mysql>show variables like 'log_%';
怎样知道当前的日志
mysql> show master status;
显示二進制日志数目
mysql> show master logs;
看二进制日志文件用mysqlbinlog
shell>mysqlbinlog mail-bin.000001
或者shell>mysqlbinlog mail-bin.000001 | tail 9000
查看二进制日志文件最后(倒数)9000行的SQL日志记录

附录:
mysqlbinlog用法详细说明
服务器生成的二进制日志文件写成二进制格式。要想检查这些文本格式的文件,应使用mysqlbinlog实用工具。
应这样调用mysqlbinlog:
shell> mysqlbinlog [options] log-files...例如,要想显示二进制日志binlog.000003的内容,使用下面的命令:
shell> mysqlbinlog binlog.0000003输出包括在binlog.000003中包含的所有语句,以及其它信息例如每个语句花费的时间、客户发出的线程ID、发出线程时的时间戳等等。
通常情况,可以使用mysqlbinlog直接读取二进制日志文件并将它们用于本地MySQL服务器。也可以使用--read-from-remote-server选项从远程服务器读取二进制日志。
当读取远程二进制日志时,可以通过连接参数选项来指示如何连接服务器,但它们经常被忽略掉,除非你还指定了--read-from-remote-server选项。这些选项是--host、--password、--port、--protocol、--socket和--user。
还可以使用mysqlbinlog来读取在复制过程中从服务器所写的中继日志文件。中继日志格式与二进制日志文件相同。
mysqlbinlog支持下面的选项:
·
---help,-?
显示帮助消息并退出。
·
---database=db_name,-d db_name
只列出该数据库的条目(只用本地日志)。
·
--force-read,-f
使用该选项,如果mysqlbinlog读它不能识别的二进制日志事件,它会打印警告,忽略该事件并继续。没有该选项,如果mysqlbinlog读到此类事件则停止。
·
--hexdump,-H
在注释中显示日志的十六进制转储。该输出可以帮助复制过程中的调试。在MySQL 5.1.2中添加了该选项。
·
--host=host_name,-h host_name
获取给定主机上的MySQL服务器的二进制日志。
·
--local-load=path,-l pat
为指定目录中的LOAD DATA INFILE预处理本地临时文件。
·
--offset=N,-o N
跳过前N个条目。
·
--password[=password],-p[password]
当连接服务器时使用的密码。如果使用短选项形式(-p),选项和 密码之间不能有空格。如果在命令行中--password或-p选项后面没有 密码值,则提示输入一个密码。
·
--port=port_num,-P port_num
用于连接远程服务器的TCP/IP端口号。
·
--position=N,-j N
不赞成使用,应使用--start-position。
·
--protocol={TCP | SOCKET | PIPE | -position
使用的连接协议。
·
--read-from-remote-server,-R
从MySQL服务器读二进制日志。如果未给出该选项,任何连接参数选项将被忽略。这些选项是--host、--password、--port、--protocol、--socket和--user。
·
--result-file=name, -r name
将输出指向给定的文件。
·
--short-form,-s
只显示日志中包含的语句,不显示其它信息。
·
--socket=path,-S path
用于连接的套接字文件。
·
--start-datetime=datetime
从二进制日志中第1个日期时间等于或晚于datetime参量的事件开始读取。datetime值相对于运行mysqlbinlog的机器上的本地时区。该值格式应符合DATETIME或TIMESTAMP数据类型。例如:
shell> mysqlbinlog --start-datetime="2004-12-25 11:25:56" binlog.000003该选项可以帮助点对点恢复。
·
--stop-datetime=datetime
从二进制日志中第1个日期时间等于或晚于datetime参量的事件起停止读。关于datetime值的描述参见--start-datetime选项。该选项可以帮助及时恢复。
·
--start-position=N
从二进制日志中第1个位置等于N参量时的事件开始读。
·
--stop-position=N
从二进制日志中第1个位置等于和大于N参量时的事件起停止读。
·
--to-last-logs,-t
在MySQL服务器中请求的二进制日志的结尾处不停止,而是继续打印直到最后一个二进制日志的结尾。如果将输出发送给同一台MySQL服务器,会导致无限循环。该选项要求--read-from-remote-server。
·
--disable-logs-bin,-D
禁用二进制日志。如果使用--to-last-logs选项将输出发送给同一台MySQL服务器,可以避免无限循环。该选项在崩溃恢复时也很有用,可以避免复制已经记录的语句。注释:该选项要求有SUPER权限。
·
--user=user_name,-u user_name
连接远程服务器时使用的MySQL用户名。
·
--version,-V
显示版本信息并退出。
还可以使用--var_name=value选项设置下面的变量:
·
open_files_limit
指定要保留的打开的文件描述符的数量。
·
--hexdump选项可以在注释中产生日志内容的十六进制转储:
shell> mysqlbinlog --hexdump master-bin.000001上述命令的输出应类似十六进制转储:

出处: http://jimmyli.blog.51cto.com/  Jimmy Li Blog 。欢迎朋友一起交流,讨论。扣扣:柒⑥柒陆叁⑤叁伍

     本文转自jimmy_lixw 51CTO博客,原文链接:http://blog.51cto.com/jimmyli/901948 ,如需转载请自行联系原作者






相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
17天前
|
存储 安全 关系型数据库
Mysql 的binlog日志的优缺点
MySQL的binlog(二进制日志)是一个记录数据库更改的日志文件,它包含了所有对数据库执行的更改操作,如INSERT、UPDATE和DELETE等。binlog的主要目的是复制和恢复。以下是binlog日志的优缺点: ### 优点: 1. **数据恢复**:当数据库出现意外故障或数据丢失时,可以利用binlog进行点恢复(point-in-time recovery),将数据恢复到某一特定时间点。 2. **主从复制**:binlog是实现MySQL主从复制功能的核心组件。主服务器将binlog中的事件发送到从服务器,从服务器再重放这些事件,从而实现数据的同步。 3. **审计**:b
|
27天前
|
SQL 关系型数据库 MySQL
MySQL数据库,可以使用二进制日志(binary log)进行时间点恢复
对于MySQL数据库,可以使用二进制日志(binary log)进行时间点恢复。二进制日志是MySQL中记录所有数据库更改操作的日志文件。要进行时间点恢复,您需要执行以下步骤: 1. 确保MySQL配置文件中启用了二进制日志功能。在配置文件(通常是my.cnf或my.ini)中找到以下行,并确保没有被注释掉: Copy code log_bin = /path/to/binary/log/file 2. 在需要进行恢复的时间点之前创建一个数据库备份。这将作为恢复的基准。 3. 找到您要恢复到的时间点的二进制日志文件和位置。可以通过执行以下命令来查看当前的二进制日志文件和位
|
1月前
|
Shell Linux C语言
【Shell 命令集合 网络通讯 】Linux 查看系统中的UUCP日志文件 uulog命令 使用指南
【Shell 命令集合 网络通讯 】Linux 查看系统中的UUCP日志文件 uulog命令 使用指南
29 0
|
1月前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 自动轮转(log rotation)日志文件 logrotate命令 使用指南
【Shell 命令集合 系统管理 】Linux 自动轮转(log rotation)日志文件 logrotate命令 使用指南
50 0
|
1月前
|
SQL 关系型数据库 MySQL
|
1月前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 实时监控日志文件 swatch命令 使用指南
【Shell 命令集合 系统管理 】Linux 实时监控日志文件 swatch命令 使用指南
34 1
|
1月前
|
存储 SQL 关系型数据库
[MySQL]事务原理之redo log,undo log
[MySQL]事务原理之redo log,undo log
|
1月前
|
SQL 缓存 关系型数据库
MySQL的万字总结(缓存,索引,Explain,事务,redo日志等)
MySQL的万字总结(缓存,索引,Explain,事务,redo日志等)
66 0
|
2月前
|
存储 监控 关系型数据库
ELK架构监控MySQL慢日志
ELK架构监控MySQL慢日志
|
2月前
|
Java Shell Perl
使用shell脚本给日志文件瘦身
使用shell脚本给日志文件瘦身