mysql binlog 备份_做好mysql运维,必须熟练掌握备份和恢复,实战一次不行多来几次...

原文:https://www.toutiao.com/i6855460778359816715/
平台:头条
作者:程序员不就是0和1

一、 备份恢复策略

进行备份或恢复操作时需要考虑一些因素:

1、确定要备份的表的存储引擎是事务型还是非事务型,两种不同的存储引擎备份方式在处理数据一致性方面是不太一样的。

2、确定使用全备份还是增量备份。全备份的优点是备份保持最新备份,恢复的时候可以花费更少的时间;缺点是如果数据量大,将会花费很多的时间,并对系统造成较长时间的压力。增量备份相反,只需要备份每天的增量日志,备份时间少,对负载压力也小;缺点就是恢复的时候需要全备份加上次备份到故障前的所有日志,恢复时间长一些。

3、可以考虑采用复制的方法来做异地备份,但不能代替备份,它对数据库的误操作也无能为力。

4、要定期做备份,备份的周期要充分考虑系统可以承受的恢复时间。备份要在系统负载较小的时候进行

5、确保 MySQL 打开 log-bin 选项,有了 binlog,MySQL 才可以在必要的时候做完整恢复,或基于时间点的恢复,或基于位置的恢复。

6、经常做备份恢复测试,确保备份是有效的,是可以恢复的。

二、 逻辑备份和恢复

在 MySQL 中,逻辑备份的最大优点是对于各种存储引擎都可以用同样的方法来备份;而物理备份则不同,不同的存储引擎有着不同的备份方法,因此,对于不同存储引擎混合的数据库,逻辑备份会简单一点。

1. 备份

MySQL 中的逻辑备份是将数据库中的数据备份为一个文本文件,备份的文件可以被查看和编辑。在 MySQL 中,可以使用 mysqldump 工具来完成逻辑备份:

// 备份指定的数据库或者数据库中的某些表  
shell> mysqldump [options] db_name [tables]  
// 备份指定的一个或多个数据库  
shell> mysqldump [options] --database DB1 [DB2,DB3...]  
// 备份所有数据库  
shell> mysqldump [options] --all-database

如果没有指定数据库中的任何表,默认导出所有数据库中的所有表。

示例:

1. 备份所有数据库:

shell>mysqldump -uroot -p --all-database > all.sql

2. 备份数据库 test

shell>mysqldump -uroot -p test > test.sql

3. 备份数据库 test 下的表 emp

shell> mysqldump -uroot -p test emp > emp.sql

4. 备份数据库 test 下的表 emp 和 dept

shell> mysqldump -uroot -p test emp dept > emp_dept.sql

5. 备份数据库test 下的所有表为逗号分割的文本,备份到 /tmp:

shell> mysqlddump -uroot -p -T /tmp test emp --fields-terminated-by ','shell> more emp.txt  1,z12,z23,z34,z4

注意:为了保证数据备份的一致性, myisam存储引擎在备份时需要加上-l参数,表示将所有表加上读锁,在备份期间,所有表将只能读而不能进行数据更新。但是对于事务存储引擎来说,可以采用更好的选项 --single-transaction,此选项使得 innodb 存储引擎得到一个快照(snapshot),使得备份的数据能够保证一致性。

2. 完全恢复

mysqldump 的恢复也很简单,将备份作为输入执行即可:

mysql -uroot -p db_name < backfile

注意,将备份恢复后数据并不完整,还需要将备份后执行的日志进行重做:

mysqlbinlog binlog-file | mysql -uroot -p

完整的 mysqldump 备份与恢复示例:

1. 凌晨 2:00,备份数据库:

root@bogon:/usr/local/mysql/bin$ ./mysqldump -uroot -p -l -F t2 > t2.dmp
Enter password:

其中 -l参数表示给所有表加读锁,-F表示生成一个新的日志文件,此时,t2 中 emp 表的数据如下:

# 为了便于测试,执行 reset master 删除所有 binlog。
MySQL [(none)]> reset master;
Query OK, 0 rows affected (0.00 sec)
# 此时只有一个 binlog 日志文件   mysql-bin.000001
MySQL [t2]> select * from test;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
+------+------+
2 rows in set (0.00 sec)

2. 备份完毕后,插入新的数据:

# 因为上一步执行是加入了 -F 选项, 所以接下来的操作会被记录到新的二进制文件,即名为 mysql-bin.000002 的文件
MySQL [t2]> insert into test values (3,'c');
Query OK, 1 row affected (0.00 sec)
MySQL [t2]> insert into test values (4,'d');
Query OK, 1 row affected (0.00 sec)

3. 数据库突然故障(其实是小伙伴没事儿删库练手玩儿),数据无法访问。需要恢复备份:

删库跑路:

# 这里为了便于测试,不把删库操作记入日志,当前 session 设置 sql_log_bin 为 off。
# 删库后,执行 flush logs,让后续的 binlog 到新的文件中,即名为 mysql-bin.000003中
MySQL [t2]> set sql_log_bin = 0;
Query OK, 0 rows affected (0.00 sec)
MySQL [t2]> show variables like "%sql_log_bin%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_log_bin   | OFF   |
+---------------+-------+
1 row in set (0.00 sec)
MySQL [t2]> drop database t2;
Query OK, 1 row affected (0.01 sec)
MySQL [(none)]> flush logs;
Query OK, 0 rows affected (0.22 sec)
MySQL [t2]> drop database t2;
Query OK, 3 rows affected (0.23 sec)
MySQL [(none)]> exit;
Bye

数据恢复:

root@bogon:/usr/local/mysql/bin# ./mysql -e "create database t2"  
root@bogon:/usr/local/mysql/bin# ./mysql t2 < t2.dmp
*******************************************************************
MySQL [t2]> select * from test;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
+------+------+
2 rows in set (0.00 sec)

4. 使用 mysqlbinlog 恢复自 mysqldump 备份以来的 binglog

根据前面操作的内容,可知从备份的时间点到删库的时间点之间的操作被记录到了 mysql-bin.000002 文件中

root@bogon:/usr/local/mysql/bin# ./mysqlbinlog --no-defaults /data/mysql/mysql-bin.000002 | ./mysql t2
*******************************************************
MySQL [t2]> select * from test;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
|    4 | d    |
+------+------+
4 rows in set (0.00 sec)

至此,数据恢复成功。

3. 基于时间点恢复

由于误操作,比如误删除了一张表,这时使用完全恢复时没有用的,因为日志里面还存在误操作的语句,我们需要的是恢复到误操作之前的状态,然后跳过误操作语句,再恢复后面执行的语句,完成恢复。这种恢复叫不完全恢复,在 MySQL 中,不完全恢复分为 基于时间点的恢复和基于位置的恢复。基于时间点恢复的操作步骤:

(1) 如果是上午 10 点发生了误操作,可以用以下语句用备份和 binlog 将数据恢复到故障前:

shell>mysqlbinlog --stop-date="2017-09-30 9:59:59" /data/mysql/mysql-bin.123456 | mysql -uroot -ppassword

(2) 跳过故障时的时间点,继续执行后面的 binlog,完成恢复。

shell>mysqlbinlog --start-date="2017-09-30 10:01:00" /data/mysql/mysql-bin.123456 | mysql -uroot -ppassword

4. 基于位置恢复

和基于时间点的恢复类似,但是更精确,因为同一个时间点可能有很多条 sql 语句同时执行。恢复的操作步骤如下:

(1) 在 shell 下执行命令:

shell>mysqlbinlog --start-date="2019-09-30 9:59:59" --stop-date="2019-09-30 10:01:00"/data/mysql/mysql-bin.123456 > /tmp/mysql_restore.sql

该命令将在 /tmp 目录创建小的文本文件,编辑此文件,知道出错语句前后的位置号,例如前后位置号分别为 368312 和 368315。

(2) 恢复了以前的备份文件后,应从命令行输入下面的内容:

shell>mysqlbinlog --stop-position="368312" /data/mysql/mysql-bin.123456 | mysql -uroot -ppassword  
shell>mysqlbinlog --start-position="368315" /data/mysql/mysql-bin.123456 | mysql -uroot -ppassword

上面的第一行将恢复到停止位置为止的所有事务。下一行将恢复从给定的起始位置直到二进制日志结束的所有事务。因为 mysqlbinlog 的输出包括每个 sql 语句记录之前的 set timestamp 语句,因此恢复的数据和相关的 mysql 日志将反映事务执行的 原时间。

三、 表的导入导出

在数据库的日常维护中,表的导入导出时很频繁的一类操作。

1. 导出

在某些情况下,为了一些特定的目的,经常需要将表里的数据导出为某些符号分割的纯数据文本,而不是 sql 语句:

1、用来作为 Excel 显示;2、单纯为了节省备份空间;3、为了快速的加载数据,load data 的加载速度比普通 sql 加载要快 20 倍以上。

使用 select ...into outfile ... 命令来导出数据,具体语法如下:

mysql> select * from tablename into outfile 'target_file' [option];

其中 option 参数可以是以下选项:

fields terminated by 'string'                   // 字段分隔符,默认为制表符't'
fields [optionally] enclosed by 'char'          // 字段引用符,如果加 optionally 选项则只用在 char、varchar 和 text 等字符型字段上,默认不使用引用符  
fields escaped by ‘char’                        // 转移字符、默认为 ''  
lines starting by 'string'                      // 每行前都加此字符串,默认''  
lines terminated by 'string'                    // 行结束符,默认为'n'  
# char 表示此符号只能是单个字符,string表示可以是字符串。

例如,将 test 表中数据导出为数据文本,其中,字段分隔符为“,”,字段引用符为“"”,记录结束符为回车符:

MySQL [t2]> select * from test into outfile '/data/mysql/outfile.txt' fields terminated by "," enclosed by '"';Query OK, 4 rows affected (0.02 sec)
zj@bogon:/data/mysql$ more outfile.txt"1","a","helloworld""2","b","helloworld""3","c","helloworld""4","d","helloworld"

发现第一列是数值型,如果不希望字段两边用引号引起,则语句改为:

MySQL [t2]> select * from test into outfile '/data/mysql/outfile2.txt' fields terminated by "," optionally  enclosed by '"';Query OK, 4 rows affected (0.03 sec)zj@bogon:/data/mysql$ more outfile2.txt1,"a","helloworld"2,"b","helloworld"3,"c","helloworld"4,"d","helloworld"

测试转义字符,MySQL 导出数据中需要转义的字符主要包括以下 3 类:

1、转义字符本身 2、字段分隔符 3、记录分隔符

MySQL [t2]> update test set content = '"##!aa' where  id=1;Query OK, 1 row affected (0.05 sec)Rows matched: 1  Changed: 1  Warnings: 0MySQL [t2]> select * from test into outfile '/data/mysql/outfile3.txt' fields terminated by "," optionally enclosed by '"';Query OK, 4 rows affected (0.03 sec)*******************************************zj@bogon:/data/mysql$ more outfile3.txt1,"a",""##!aa"2,"b","helloworld"3,"c","helloworld"4,"d","helloworld"

1、当导出命令中包含字段引用符时,数据中含有转义字符本身和字段引用符的字符需要被转义;

2、当导出命令中不包含字段引用符时,数据中含有转义字符本身和字段分割符的字符需要被转义。

注意:select ... into outfile ... 产生的输出文件如果在目标目录下有重名文件,将不会被创建成功,源文件不会被自动覆盖。

使用 mysqldump 导出数据为文本的具体语法如下:

mysqldump -u username -T target_dir dbname tablename [option]

其中,option 参数可以是以下选项:

1、--fields-terminated-by=name (字段分隔符);

2、--fields-enclosed-by=name (字段引用符);

3、--fields-optionally-enclosed-by=name (字段引用符,只用在 char、varchar 和 test 等字符型字段上);

4、--fields-escaped-by=name (转义字符);

5、--lines-terminated-by=name (记录结束符);

例子:

629b1bf5780ffb58f625471a8030fe50.png

可以发现,除多了一个表的创建脚本文件,mysqldump 和 select ... into outfile ... 的选项和语法非常相似。其实 mysqldump 实际调用的就是后者提供的接口,并在其上面添加了一些新的功能而已。

2. 导入

导入用 select ... into outfile 或者 mysqldump 导出的纯数据文本

和导出类似,导入也有两种不同的方法,分别是 load data infile... 和 mysqlimport,它们的本质是一样的,区别只是在于一个在 MySQL 内部执行,另一个在 MySQL 外部执行。

使用 “load data infile...” 命令,具体语法如下

mysql> load data [local]infile 'filename' into table tablename [option]

option 可以是以下选项:

1、fields terminated by 'string' (字段分割符,默认为制表符't');

2、fields [optionally] enclosed by 'char' (字段引用符,如果加 optionally 选项则只用在 char varchar text 等字符型字段上。默认不使用引用符);

3、fields escaped by 'char' (转义字符,默认为'')

4、lines starting by 'string' (每行前都加此字符串,默认为'')

5、lines terminated by 'string' (行结束符,默认为'n')

6、ignore number lines (忽略输入文件中的前几行数据)

7、(colnameoruservar,...) (按照列出的字段顺序和字段数量加载数据);8、set col_name = expr,...将列做一定的数值转换后再加载。

fields 、lines 和前面 select...into outfile...的含义完全相同,不同的是多了几个不同的选项,下面的例子将文件'test.txt'中的数据加载到表 test 中:

37d3dd10a1f57f666c05738e2c040aa0.png

如果不希望加载文件中的前两行,可以进行如下操作:

a8ee2bba6b55289ddd02548f77c30e41.png

使用 mysqldump 实现

shell> mysqlimport -uroot -p [--local] dbname order_tab.txt [option]

其中,option 参数可以是以下选项:

1、fields-terminated-by=name (字段分隔符) 2、fields-enclosed-by=name (字段引用符) 3、fields-optionally-enclosed-by=name (字段引用符,只用在 char、varchar、text等字符型字段上) 4、fields-escaped-by=name (转义字符) 5、lines-terminated-by=name (记录结束符) 6、ignore-lines=number (忽略前几行)

注意:如果导入和导出是跨平台操作的(windows 和 linux),那么要注意设置参数 line-terminated-by,windows 上设置为 line-terminated-by='rn', linux 上设置为 line-terminated-by='n'。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在过程中要正式批准可交付成果_干货!软考高项项目管理知识体系5大过程组47个过程...

现在应该很多小伙伴都在紧张的复习软考中&#xff0c;为了让大家更加高效的复习&#xff0c;今天给大家分享软考高级信息系统项目管理师的考试重点&#xff0c;项目管理知识体系的5大过程组47个过程。考高项的朋友都知道&#xff0c;47个过程是非常重要的&#xff0c;必须要理解…

jquery每次动态加载dom,绑定事件会多一次,

jquery绑定事件,每次动态加载dom,绑定的事件会加1,比如动态加载dom5次,点那个点击事件会弹出5次 解决办法就是在每次绑定之前解绑定. $(.seek-footer .btn1).off(click); // 先解绑 $(.seek-footer .btn1).on(click,function () {}) 再绑定 转载于:https://www.cnblogs.com/ybi…

洛谷P3119

省选难度啊啊啊 经评论区的朋友提醒&#xff0c;代码已订正 先说一下该题思路: 首先,这题并非是求最短路,而是求最长路(最长路常用算法一般是拓扑排序,而我这个蒟蒻还没有学会QAQ) 但是这一题既然标签是连通图,那么肯定要用tarjan,考虑到缩点之后每个缩点都具有一定数量的点数,…

android 组件化_Android 组件化路由框架设计(仿Arouter)

前言在组件化开发中一个必须要面对的问题就是组件间页面跳转&#xff0c;实现的方法有很多&#xff0c;简单的可以通过反射获取&#xff0c;但是比较耗费性能&#xff0c;也可以通过隐式跳转&#xff0c;但是随着页面的增多&#xff0c;过滤条件会随之增多&#xff0c;后期维护…

1668智能下数教程视频_你需要的教程合集更新

最近又收集了一波网络安全资源&#xff0c;在文章最底部。花了将近一天时间整理&#xff0c;只求各位小哥哥能点个在看&#xff0c;分享给身边的朋友。网络安全 --职业发展(渗透的最底部)2019网络安全初识与职业发展https://pan.baidu.com/s/1CAzO8IWxzBj-bOZlJ2eFVg 提取码&am…

关于java中nextline读取空白行的问题

最近在做java作业, 发现了一个问题, 就是nextline其实会接收缓冲区的\r, 使得在程序运行时nextline像是跳过了一样, 其实不然, 它只是读取了上一个enter时的\r, 如我的如下功能代码 public void run() {Scanner scan new Scanner(System.in);int ord, book_order;int flag 0;…

python汉字长度_行中字符串的长度(Python)

我正在尝试将一个.txt文件导入到一些专有软件中&#xff0c;但似乎不断收到一个错误。txt文件的大小几乎是2GB&#xff0c;大约有5600万行。 与制造商交谈后&#xff0c;他们说其中一条线路可能有错误。每一行应该包含一个MD5哈希值&#xff08;32个字符&#xff09;&#xff0…

pilz pnoz s4说明书_如何使用Pilz的安全继电器PNOZ S4?

前面的文章我们曾介绍过皮尔磁(Pilz)的安全继电器PNOZ X3和X2.7P/2.8P &#xff0c;(参考&#xff1a;如何使用Pilz的安全继电器PNOZ X2.7P/X2.8P&#xff1f;)今天这篇文章&#xff0c;我们来介绍另外一款安全继电器产品PNOZ s4.PNOZ s4可以用于急停按钮、安全门、安全开关等场…

推荐系统——协同过滤

协同过滤 协同过滤算法一般是通过用户之前的喜好或者相似的用户的喜好来推荐商品 基于领域的协同过滤算法一般有两种算法&#xff1a; 基于用户的协同过滤算法(UserCF):基于与用户相似用户的喜好进行推荐基于物品的协同过滤算法(ItemCF):基于用户喜好的物品寻找相似的物品进…

apriori算法代码_sklearn(九)apriori 关联规则算法,以及FP-growth 算法

是什么&#xff1a;apriori算法是第一个关联规则挖掘算法&#xff0c;利用逐层搜索的迭代方法找出数据库中的项集&#xff08;项的集合&#xff09;的关系&#xff0c;以形成规则&#xff0c;其过程由连接&#xff08;类矩阵运算&#xff09;与剪枝&#xff08;去掉没必要的中间…

电感检测_几种常用的电流检测方式

RT1720 是一款最高输入电压可达 80V、输出电压可达 60V 的热插拔控制器&#xff0c;它的作用是防止系统受到过高电压和负电压的攻击&#xff0c;同时还能防范过电流可能导致的问题&#xff0c;它的一种应用电路大致如下图所示&#xff1a;为了检测负载电流的大小&#xff0c;RS…

推荐系统——矩阵分解FM

矩阵分解 隐语义模型与矩阵分解 之所以我们提出隐语义模型与矩阵分解&#xff0c;原因就是[[协同过滤]]存在泛化能力弱的问题 而对于隐语义模型而言&#xff0c;我们可以利用隐向量来代表隐藏信息 此外&#xff0c;也可以在一定程度上弥补[[协同过滤]]处理稀疏矩阵能力不足的…

python wait_Python的等效Java函数wait(),notify(),synchronized

我必须在Python 2.7中编写一个类,我有一些问题. 我最近来自java背景和学习python 如果我必须在java中做,我会写这些 public class CommandSender extends Thread { private boolean isTimeOut; private boolean running; private ArrayList 我现在做了什么 class CommandSender…

千位分隔符的完整攻略

千位分隔符[1]是很常见的需求&#xff0c;但是输入文本千变万化&#xff0c;如何才能准确添加千分符呢&#xff1f; 纯整数情况 纯整数大概是所有情况里最简单的一种&#xff0c;我们只要正确匹配出千分位就好了。 观察上面的数字&#xff0c;我们可以得出千分位的特征是到字符…

限制按钮点击_Android | 使用 AspectJ 限制按钮快速点击

前言在Android开发中&#xff0c;限制按钮快速点击&#xff08;按钮防抖&#xff09;是一个常见的需求&#xff1b;在这篇文章里&#xff0c;我将介绍一种使用AspectJ的方法&#xff0c;基于注解处理器 & 运行时注解反射的原理。如果能帮上忙&#xff0c;请务必点赞加关注&…

svn不知道这样的主机 怎么解决_家里装修不知道怎么配置净水器,这几招教你轻松解决...

为了保障家庭饮水健康&#xff0c;很多业主都会选择在家中安装一台厨下净水器。但是&#xff0c;如若仅靠它来满足全家人日常洗漱&#xff0c;沐浴和饮用&#xff0c;这势必会极大地影响到全家人的生活品质。这个时候&#xff0c;实阳机电良心建议&#xff0c;全屋净水系统&…

推荐系统——Wide Deep

[[点击率]]预估介绍 点击率预估是对每次广告点击情况作出预测&#xff0c;可以输出点击或者不点击&#xff0c;也可以输出该次点击的概率&#xff0c;后者有时候也称为pClick.对于点击率预估模型而言&#xff0c;其最终作用是输出点击的一个概率&#xff0c;是一个回归模型 可…

redis系列:通过文章点赞排名案例学习sortedset命令

前言 这一篇文章将讲述Redis中的sortedset类型命令&#xff0c;同样也是通过demo来讲述&#xff0c;其他部分这里就不在赘述了。 项目Github地址&#xff1a;https://github.com/rainbowda/learnWay/tree/master/learnRedis/case-sortedset 案例 demo功能是文章点赞排名等等&am…

xml生成2维码_MyBatis(2)之MyBatis-Generator最佳实践

自定义注释自定义注解指定xml文件模式上一篇文章详细阐述了xml配置文件的各种标签及其含义。其实从标签开始&#xff0c;每一个标签都对应一个实体类。context.class对应标签&#xff0c;而每一个子标签都对应一个属性&#xff1b;如图&#xff1a;标签与实体类的对应关系。有了…

nginx 配置详解_Nginx 配置详解

序言Nginx是lgor Sysoev为俄罗斯访问量第二的http://rambler.ru站点设计开发的。从2004年发布至今&#xff0c;凭借开源的力量&#xff0c;已经接近成熟与完善。Nginx功能丰富&#xff0c;可作为HTTP服务器&#xff0c;也可作为反向代理服务器&#xff0c;邮件服务器。支持Fast…