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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS AI 助手,专业版
简介:
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。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
关系型数据库 MySQL PHP
PHP与MySQL的深度整合:构建高效动态网站####
在当今这个数据驱动的时代,掌握如何高效地从数据库中检索和操作数据是至关重要的。本文将深入探讨PHP与MySQL的深度整合方法,揭示它们如何协同工作以优化数据处理流程,提升网站性能和用户体验。我们将通过实例分析、技巧分享和最佳实践指导,帮助你构建出既高效又可靠的动态网站。无论你是初学者还是有经验的开发者,都能从中获得宝贵的见解和实用的技能。 ####
267 27
|
关系型数据库 MySQL PHP
PHP与MySQL的无缝集成:构建动态网站的艺术####
本文将深入探讨PHP与MySQL如何携手合作,为开发者提供一套强大的工具集,以构建高效、动态且用户友好的网站。不同于传统的摘要概述,本文将以一个生动的案例引入,逐步揭示两者结合的魅力所在,最终展示如何通过简单几步实现数据驱动的Web应用开发。 ####
|
SQL 关系型数据库 MySQL
PHP与MySQL协同工作的艺术:开发高效动态网站
在这个后端技术迅速迭代的时代,PHP和MySQL的组合仍然是创建动态网站和应用的主流选择之一。本文将带领读者深入理解PHP后端逻辑与MySQL数据库之间的协同工作方式,包括数据的检索、插入、更新和删除操作。文章将通过一系列实用的示例和最佳实践,揭示如何充分利用这两种技术的优势,构建高效、安全且易于维护的动态网站。
【Azure Policy】分享Policy实现对Azure Activity Log导出到Log A workspace中
在Policy Rule部分中,选择资源的类型为 "Microsoft.Resources/subscriptions", 效果使用 DeployIfNotExists (如果不存在,则通过修复任务进行修正。 在 existenceCondition 条件中,如果当前订阅已经启用了 diagnostic setting并且输出日志到同一个Log A workspace,表示满足Policy要求,不需要进行修正。 在 deployment 中,使用了 ARM 模板, 为订阅添加Diagnostic Setting并且所有的日志Category均启用。
149 3
|
Java Shell Linux
【Linux入门技巧】新员工必看:用Shell脚本轻松解析应用服务日志
关于如何使用Shell脚本来解析Linux系统中的应用服务日志,提供了脚本实现的详细步骤和技巧,以及一些Shell编程的技能扩展。
564 0
【Linux入门技巧】新员工必看:用Shell脚本轻松解析应用服务日志
|
Shell 测试技术 Linux
Shell 脚本循环遍历日志文件中的值进行求和并计算平均值,最大值和最小值
Shell 脚本循环遍历日志文件中的值进行求和并计算平均值,最大值和最小值
338 3
|
监控 数据管理 关系型数据库
数据管理DMS使用问题之是否支持将操作日志导出至阿里云日志服务(SLS)
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
数据库
基于PHP+MYSQL开发制作的趣味测试网站源码
基于PHP+MYSQL开发制作的趣味测试网站源码。可在后台提前设置好缘分, 自己手动在数据库里修改数据,数据库里有就会优先查询数据库的信息, 没设置的话第一次查询缘分都是非常好的 95-99,第二次查就比较差 , 所以如果要你女朋友查询你的名字觉得很好 那就得是她第一反应是查和你的缘分, 如果查的是别人,那不好意思,第二个可能是你。
280 3
|
SQL 运维 关系型数据库

推荐镜像

更多