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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:
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 ,如需转载请自行联系原作者






相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
Java Shell
「sh脚步模版自取」测试线排查的三个脚本:启动、停止、重启、日志保存
「sh脚步模版自取」测试线排查的三个脚本:启动、停止、重启、日志保存
68 1
|
4月前
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
151 68
|
3月前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
169 3
|
4月前
|
关系型数据库 MySQL PHP
PHP与MySQL的无缝集成:构建动态网站的艺术####
本文将深入探讨PHP与MySQL如何携手合作,为开发者提供一套强大的工具集,以构建高效、动态且用户友好的网站。不同于传统的摘要概述,本文将以一个生动的案例引入,逐步揭示两者结合的魅力所在,最终展示如何通过简单几步实现数据驱动的Web应用开发。 ####
|
4月前
|
监控 数据挖掘 数据安全/隐私保护
Python脚本:自动化下载视频的日志记录
Python脚本:自动化下载视频的日志记录
|
5月前
|
SQL 关系型数据库 MySQL
|
4月前
|
关系型数据库 MySQL PHP
PHP与MySQL的深度整合:构建高效动态网站####
在当今这个数据驱动的时代,掌握如何高效地从数据库中检索和操作数据是至关重要的。本文将深入探讨PHP与MySQL的深度整合方法,揭示它们如何协同工作以优化数据处理流程,提升网站性能和用户体验。我们将通过实例分析、技巧分享和最佳实践指导,帮助你构建出既高效又可靠的动态网站。无论你是初学者还是有经验的开发者,都能从中获得宝贵的见解和实用的技能。 ####
50 0
|
5月前
|
SQL 关系型数据库 MySQL
PHP与MySQL协同工作的艺术:开发高效动态网站
在这个后端技术迅速迭代的时代,PHP和MySQL的组合仍然是创建动态网站和应用的主流选择之一。本文将带领读者深入理解PHP后端逻辑与MySQL数据库之间的协同工作方式,包括数据的检索、插入、更新和删除操作。文章将通过一系列实用的示例和最佳实践,揭示如何充分利用这两种技术的优势,构建高效、安全且易于维护的动态网站。
|
5月前
|
关系型数据库 MySQL 数据库
DZ社区 mysql日志清理 Discuz! X3.5数据库可以做定期常规清理的表
很多站长在网站日常维护中忽略了比较重要的一个环节,就是对于数据库的清理工作,造成数据库使用量增加必须多的原因一般有2个:后台站点功能开启了家园,此功能现在很少有论坛会用到,但是灌水机会灌入大量垃圾信息致使站长长时间未能发觉;再有就是程序默认的一些通知类表单会存放大量的、对于网站日常运行并无意义的通知信息。
178 2
|
5月前
|
存储 关系型数据库 数据库
数据库启用慢速查询日志如何增强 Postgres 可观测性
数据库启用慢速查询日志如何增强 Postgres 可观测性
83 1