这片博文主要用来介绍MySQL的备份与恢复:

MySQL的备份形式可以分为如下几种:

  • 热备----即不停机备份
  • 冷备----需要关闭MySQL,然后备份其数据文件。(停机备份一般是直接拷贝其datadir目录)
  • 温备----在线备份,对应用影响大,通常加一个读锁【会阻塞写的应用】,意义不大,基本不用。

从导出的备份文件结构可分为如下几种:

  • 逻辑备份---备份的数据是导出的SQL语句(如mysqldump, mysqlpump【MySQL5.7加入的】,mydumper)
  • 物理备份--备份的是物理文件(如xtracebackup)

接下来会详细介绍这四种命令的通常用法(如果不特别说明,数据库存储引擎为INNODB):

mysqldump备份与恢复

mysqldump的用法如下:

[root@test3 ~]# mysqldump
Usage: mysqldump [OPTIONS] database [tables]            #备份单个库
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] #备份多个库
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]              #备份所有的数据库

#可以使用mysqldump --help查看mysqldump的更多参数,会在下面使用的时候介绍到经常用的参数。

备份单张表:

[root@test3 ~]# mysqldump -uroot -p123456 --single-transaction employees departments > dep.sql#备份INNODB存储引擎时建议加上参数--single-transaction【实际上是必须加】,这样会保证数据的一致性。查看一下备份出来的数据:[root@test3 ~]# cat dep.sql           #可以看到基本就是SQL语句-- MySQL dump 10.13  Distrib 5.7.22, for linux-glibc2.12 (x86_64)---- Host: localhost    Database: employees-- -------------------------------------------------------- Server version    5.7.22-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;/*!40101 SET NAMES utf8 */;/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;/*!40103 SET TIME_ZONE='+00:00' */;/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

---- Table structure for table `departments`--

DROP TABLE IF EXISTS `departments`;        #看到这里发现了建表语句,也就是没有建库语句,因此若想把sql语句导入指定库,需要先创建库/*!40101 SET @saved_cs_client     = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;CREATE TABLE `departments` (  `dept_no` char(4) NOT NULL,  `dept_name` varchar(40) NOT NULL,  PRIMARY KEY (`dept_no`),  UNIQUE KEY `dept_name` (`dept_name`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;/*!40101 SET character_set_client = @saved_cs_client */;

---- Dumping data for table `departments`--

LOCK TABLES `departments` WRITE;/*!40000 ALTER TABLE `departments` DISABLE KEYS */;           #插入语句INSERT INTO `departments` VALUES ('d009','Customer Service'),('d005','Development'),('d002','Finance'),('d003','Human Resources'),('d001','Marketing'),('d004','Production'),('d006','Quality Management'),('d008','Research'),('d007','Sales');/*!40000 ALTER TABLE `departments` ENABLE KEYS */;UNLOCK TABLES;/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2018-11-28  9:51:01

在备份文件中插入二进制日志的信息该选项将binlog的位置和文件名追加到输出文件中。如果为1,将会输出CHANGE MASTER 命令;如果为2,输出的CHANGE MASTER命令前添加注释信息。该选项将打开--lock-all-tables 选项,除非--single-transaction也被指定(在这种情况下,全局读锁在开始导出时获得很短的时间)。该选项自动关闭--lock-tables选项。[root@test3 mysql]# mysqldump -uroot -p123456 --single-transaction --master-data employees departments > dep.sqlmysqldump: [Warning] Using a password on the command line interface can be insecure.[root@test3 mysql]# cat dep.sql -- MySQL dump 10.13  Distrib 5.7.22, for linux-glibc2.12 (x86_64)---- Host: localhost    Database: employees-- -------------------------------------------------------- Server version    5.7.22-log

......

---- Position to start replication or point-in-time recovery from    #这里有个提示基于这个点开始复制或者PIT恢复--

CHANGE MASTER TO MASTER_LOG_FILE='test3-bin.000001', MASTER_LOG_POS=20182;.....

#mysqldump备份时常用的两个选项

--single-transaction Creates a consistent snapshot by dumping all tables in asingle transaction. Works ONLY for tables stored instorage engines which support multiversioning (currentlyonly InnoDB does); the dump is NOT guaranteed to beconsistent for other storage engines. While a--single-transaction dump is in process, to ensure avalid dump file (correct table contents and binary logposition), no other connection should use the followingstatements: ALTER TABLE, DROP TABLE, RENAME TABLE,TRUNCATE TABLE, as consistent snapshot is not isolatedfrom them. Option automatically turns off --lock-tables.
在备份INNODB数据库时,事实上必须加上--single-transaction参数,这个参数会保证备份出的数据是一致的,也就是备份的数据是当前执行此命令时刻点的数据。
--single-transaction利用INNODB的MVCC特性,在备份数据会根据undo和redo得到一份快照数据。INNODB的MVCC特性在RR和RC的隔离级别下,得到的快照数据是不同,在RR
得到的是当前事务开始时的快照数据,在RC时得到的最新的事务数据。因为数据库的正式环境一般是RC模式,因此这条命令在备份开始时,会设置当前会话的隔离级别为RR模式!

--single-transaction 参数说明

备份单个库和备份所有的库

[root@test3 mysql]# mysqldump -uroot -p123456 --single-transaction --master-data --databases cmdb hostinfo  > dep.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@test3 mysql]# mysqldump -uroot -p123456 --single-transaction --master-data --all-databases  > all.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
#查看数据
[root@test3 mysql]# cat dep.sql       #查看其中的一个数据
-- MySQL dump 10.13  Distrib 5.7.22, for linux-glibc2.12 (x86_64)
--
-- Host: localhost    Database: cmdb
-- ------------------------------------------------------
-- Server version    5.7.22-log
......--
-- Position to start replication or point-in-time recovery from
--CHANGE MASTER TO MASTER_LOG_FILE='test3-bin.000001', MASTER_LOG_POS=20182;--
-- Current Database: `cmdb`          #这里有了创建数据库的语句
--CREATE DATABASE /*!32312 IF NOT EXISTS*/ `cmdb` /*!40100 DEFAULT CHARACTER SET utf8 */;USE `cmdb`;

#因此在使用指定库备份文件恢复数据时,不需要再创建库,直接恢复即可

恢复数据的时候直接使用mysql导入即可:

mysql -uroot -p123456 < all.sql

切记在备份INNODB数据库时一定要加上--single-transaction 参数,为了基于PIT恢复也要加上--master-data参数。

mysqldump的备份过程

上面我们已经看到了mysqldump备份出的数据文件时对应sql语句,我们查看一下在执行mysqldump时,MySQL数据库做了哪些操作!

首先开启general_log日志,如下:

mysql> set global general_log=on;
Query OK, 0 rows affected (0.00 sec)
mysql> set global log_output="file";
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like "%general%";
+------------------+-----------------------+
| Variable_name    | Value                 |
+------------------+-----------------------+
| general_log      | ON                    |
| general_log_file | /data/mysql/test3.log |
+------------------+-----------------------+
2 rows in set (0.00 sec)

然后再去使用mysqldump备份一次数据文件

[root@test3 ~]# mysqldump -uroot -p123456 --single-transaction --master-data --databases tpcc_test > dep.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@test3 ~]#

最后查看general_log日志,如下:

[root@test3 mysql]# cat test3.log 2018-11-28T05:20:31.014426Z       29 Connect    root@localhost on  using Socket
2018-11-28T05:20:31.014662Z       29 Query    /*!40100 SET @@SQL_MODE='' */
2018-11-28T05:20:31.014792Z       29 Query    /*!40103 SET TIME_ZONE='+00:00' */
2018-11-28T05:20:31.014915Z       29 Query    FLUSH /*!40101 LOCAL */ TABLES
2018-11-28T05:20:31.015141Z       29 Query    FLUSH TABLES WITH READ LOCK        #这里有个锁表
2018-11-28T05:20:31.015213Z       29 Query    SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ  #设置当前会话的隔离级别
2018-11-28T05:20:31.015271Z       29 Query    START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */   #开始事务
2018-11-28T05:20:31.015463Z       29 Query    SHOW VARIABLES LIKE 'gtid\_mode'                         #备份gtid信息
2018-11-28T05:20:31.018393Z       29 Query    SHOW MASTER STATUS                                       #在备份时指定master-data,这里备份日志点信息
2018-11-28T05:20:31.018467Z       29 Query    UNLOCK TABLES                                            #释放表
2018-11-28T05:20:31.018618Z       29 Query    SELECT LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZE, ENGINE, EXTRA FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'UNDO LOG' AND FILE_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IN (SELECT DISTINCT LOGFILE_GROUP_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('tpcc_test'))) GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE, TOTAL_EXTENTS, INITIAL_SIZE ORDER BY LOGFILE_GROUP_NAME
2018-11-28T05:20:31.021966Z       29 Query    SELECT DISTINCT TABLESPACE_NAME, FILE_NAME, LOGFILE_GROUP_NAME, EXTENT_SIZE, INITIAL_SIZE, ENGINE FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('tpcc_test')) ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME
2018-11-28T05:20:31.022750Z       29 Query    SHOW VARIABLES LIKE 'ndbinfo\_version'
2018-11-28T05:20:31.023915Z       29 Init DB    tpcc_test
2018-11-28T05:20:31.023977Z       29 Query    SHOW CREATE DATABASE IF NOT EXISTS `tpcc_test`
2018-11-28T05:20:31.024045Z       29 Query    SAVEPOINT sp                                            #备份每张表之前会设置保存点
2018-11-28T05:20:31.024100Z       29 Query    show tables
2018-11-28T05:20:31.024253Z       29 Query    show table status like 'customer'
2018-11-28T05:20:31.024475Z       29 Query    SET SQL_QUOTE_SHOW_CREATE=1
2018-11-28T05:20:31.024541Z       29 Query    SET SESSION character_set_results = 'binary'
2018-11-28T05:20:31.024607Z       29 Query    show create table `customer`
2018-11-28T05:20:31.024737Z       29 Query    SET SESSION character_set_results = 'utf8'
2018-11-28T05:20:31.024806Z       29 Query    show fields from `customer`
2018-11-28T05:20:31.025199Z       29 Query    show fields from `customer`
2018-11-28T05:20:31.025582Z       29 Query    SELECT /*!40001 SQL_NO_CACHE */ * FROM `customer`
2018-11-28T05:20:35.251932Z       29 Query    SET SESSION character_set_results = 'binary'
2018-11-28T05:20:35.252069Z       29 Query    use `tpcc_test`
2018-11-28T05:20:35.252158Z       29 Query    select @@collation_database
2018-11-28T05:20:35.252290Z       29 Query    SHOW TRIGGERS LIKE 'customer'
2018-11-28T05:20:35.252706Z       29 Query    SET SESSION character_set_results = 'utf8'
2018-11-28T05:20:35.252771Z       29 Query    ROLLBACK TO SAVEPOINT sp                               #这张表备份结束之后,回滚保存点............

以上的过程可以看到,mysqldump是在一个事务中备份的,因此在备份表时会产生undo日志,若是表数据太大,则undo日志也会很大,因此mysqldump在备份每张表时都设置savepoint,这样当这个表备份完成之后,就会回滚保存点,然后purge线程就会回收undo日志

mysqld的其余常见参数应用:

-d:只备份指定数据库表的结构(也就是建表语句)

[root@test3 ~]# mysqldump -uroot -p123456 -d --databases lianxi > dep.sql    #这样只备份出lianxi这个库中表的建表语句和创建库的语句[root@test3 ~]# mysqldump -uroot -p123456 -d lianxi tb2 > dep.sql            #如果这里只备份库下面的表,则还是没有建库语句,只有创建表的语句

-R, --routines :备份时导出存储过程和自定义函数!

[root@test3 ~]# mysqldump -uroot -p123456 -R lianxi tb2 > dep.sql

-f, --force         Continue even if we get an SQL error.。发生错误的时候也继续备份。

mysqldump还有很多参数,可以在用到的时候查看!

mysqldump是逻辑备份,单线程备份,单线程恢复,因此会比较慢。特别是恢复的时候,之前恢复过一个800多万行记录的数据,结果使用mysql逐条导入sql语句,搞库几个小时。

备份与恢复纠错

1:在使用mysql导入mysqldump的备份数据时,报了如下错误:

[root@test3 ~]# mysql -uroot -p123456 financesys < financesys.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1118 (42000) at line 25: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.

错误原因就是行太长了,但是线上环境修改字段属性有点不太合适,可以采用如下方法:

mysql> set global innodb_strict_mode=off;
Query OK, 0 rows affected (0.00 sec)
[root@test3 ~]# mysql -uroot -p123456 financesys < financesys.sql        #再导入就可以了
mysql: [Warning] Using a password on the command line interface can be insecure.

从MySQL5.5.X版本开始,你可以开启InnoDB严格检查模式,尤其采用了页数据压缩功能后,最好是开启该功能。开启此功能后,当创建表(CREATE TABLE)、更改表(ALTER TABLE)和创建索引(CREATE INDEX)语句时,如果写法有错误,不会有警告信息,而是直接抛出错误,这样就可直接将问题扼杀在摇篮里。开启InnoDB严格检查模式涉及的参数是innodb_strict_mode,默认为OFF,支持动态开启,开启方式如下:
set global innodb_strict_mode=1;连接地址

导入成功后,如果是线上环境,还需要把参数修改回去!

2:在使用mysqldump备份的时候出现如下问题

[root@test2 data]# mysqldump -uroot -p7abec53701c3eefb --databases financesys > financesys1.sql
mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table `fi_factincome` at row: 1303198

我查了一下,这个表大概有1500万行的记录,报错原因如下:

备份失败的原因:在向磁盘上备份的时候,数据的流向是这样的:MySQL Server 端从数据文件中检索出数据,然后分批将数据返回给mysqldump 客户端,然后 mysqldump 将数据写入到磁盘上。一般地,向 磁盘 上写入数据的速度较之Server端检索发送数据的速度要慢得多,这就会导致 mysqldump 无法及时的接受 Server 端发送过来的数据,Server 端的数据就会积压在内存中等待发送,这个等待不是无限期的,当 Server 的等待时间超过 net_write_timeout(默认是60秒)时它就失去了耐心,mysqldump 的连接会被断开,同时抛出错误 Got error: 2013: Lost connection。其实该错误不是说数据库文件太多而导致出错,而是单张表数据量太大导致备份失败

问题的解决方案:增加 net_write_timeout 可以解决上述的问题的。在实践中发现,在增大 net_write_timeout 后,Server 端会消耗更多的内存,有时甚至会导致 swap 的使用(并不确定是不是修改 net_write_timeout 所至)。建议在mysqldump 之前修改 net_write_timeout 为一个较大的值(如1800),在 mysqldump 结束后,在将这个值修改到默认的60。(备注:net_write_timeout不是mysqldump的配置参数,而是mysql的参数)

转载于:https://www.cnblogs.com/wxzhe/p/10032153.html

MySQL备份与恢复-mysqldump备份与恢复相关推荐

  1. MySQL日志、备份与恢复

    文章目录 概述 mysql日志文件 错误日志 二进制日志 中继日志 慢查询日志 查询命令 备份类型 从物理与逻辑的角度分类 从数据库的备份策略角度分类 完全备份 差异备份 增量备份 备份方法 物理冷备 ...

  2. mysql运维管理-mysqldump 备份与恢复数据库20

    mysqldump 备份与恢复数据库 备份: 1.备份全部数据库的数据和结构 mysqldump -uroot -pjsb -A > /bk/all.sql -A: 备份所有数据库=--all- ...

  3. mysql数据库mysqldump还原_mysqldump数据库备份与恢复

    mysqldump -u 用户名 -p 数据库名> 备份的文件名 本文中因服务器为多实例,所以在执行登陆等命令时指定了-S参数,即指定其中一个数据库 备份: mysqldump -u root ...

  4. mysql对数据库进行备份吗_怎么对MySQL数据库进行备份与恢复

    MySQL的备份与恢复 前言:前面我们已经了解了 MySQL 数据库的安装及使用,但随着自动化办公与电子商务的不断发展,企业对信息系统的依赖性越来越高,而 数据库 在信息系统中担任着非常重要的角色.尤 ...

  5. 360隔离mysql恢复_MySQL备份与恢复

    博文目录 一.MySQL完全备份与恢复 二.数据库备份类型 三.常见的备份方法 四.数据库完全备份操作 五.MySQL增量备份与恢复 一.MySQL完全备份与恢复 备份的主要目的是灾难恢复,备份还可以 ...

  6. MySQL数据库之备份与恢复

    目录 引言 一.MySQL日志管理 1.日志的类型与作用 redo 重做日志 undo 回滚日志 errorlog 错误日志 slow query log 慢查询日志 bin log 二进制日志 re ...

  7. MySQL之Xtrabackup备份与恢复

    MySQL之Xtrabackup备份与恢复 一.Xtrabackup介绍 MySQL冷备.mysqldump.MySQL热拷贝都无法实现对数据库进行增量备份.在实际生产环境中增量备份是非常实用的,如果 ...

  8. 数据库(mysql)之备份与恢复

    目录 一.MySQL日志管理 1.日志类型与作用 1.redo (重做日志) 2.undo(回滚日志) 3.errorlog(错误日志)☆ 4.slow query log(慢查询日志)☆ 5.bin ...

  9. mysql数据库的备份与恢复PPT_mysql数据库的备份与恢复

    mysql数据库的备份与恢复 mysqldump命令用于备份数据库数据 格式为:mysqldump [参数][数据库名称] 如果是用mysqldump 来做备份.那么备份用户的相关权限如下: crea ...

最新文章

  1. WC2018集训 吉老师的军训练
  2. SAP零售业解决方案
  3. CodeCombat编程游戏
  4. (九)栈上分配与逃逸分析
  5. vb子程序未定义怎么改怎么办_提示子程序或函数未定义怎么修改。。。
  6. 主机主浏览服务器宣告的运作原理机制
  7. CPU版本文本分类代码 寒老师
  8. win10怎么重装系统虚拟机win7
  9. 镜头分割:像素域方法综述
  10. python+sklearn利用特征文件来训练和测试模型并使用joblib方法持久化存储模型
  11. nginx平滑重启与平滑升级的方法
  12. vue 中如何引入字体(思源黑体)
  13. iweboffice文档内容服务器文件,iWebOffice2015使用常见问题-NTKOOffice文档控件.doc
  14. ZLG USBCAN-II+ Linux驱动安装make报错问题
  15. R语言manova函数多元方差分析(MANOVA)、单因素多元方差分析的两个假设是多元正态性和方差-协方差矩阵的齐性、QQ图评估多元正态性、mvoutlier包中的aq.plot函数检验多变量异常值
  16. 微信公众号网页授权登录完整步骤版学不会你打我....
  17. 医院计算机培训ppt,计算机培训讲义.ppt
  18. 二极管(二):肖特基二极管
  19. 【区块链论文阅读】A Weak Consensus Algorithm and Its Applic
  20. IE浏览器-官网下载地址

热门文章

  1. 这是一个沙雕题II(思维好题)
  2. mysql中存储日期的类型_选择合适的 MySQL 日期时间类型来存储你的时间
  3. android accessibilityservice 被报病毒,无障碍功能AccessibilityService,卡顿,一直报warning...
  4. python正则表达式快速入门_Python学习笔记——正则表达式入门
  5. 【Transformer】TransMix: Attend to Mix for Vision Transformers
  6. 目标检测 dcn v2_使用Detectron2分6步进行目标检测
  7. 发布md 的文章测试
  8. vba 提取 json某个值_Excel中提取不重复值的方法汇总(5种基础+VBA+1个自定义函数)...
  9. dijkstra算法_Python实现图的经典DFS、BFS、Dijkstra、Floyd、Prim、Kruskal算法
  10. delphi打印html文件路径,Delphi获取文件名、不带扩展名文件名、文件所在路径、上级文件夹路径的方法...