热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL备份与恢复-mysqldump备份与恢复

这片博文主要用来介绍MySQL的备份与恢复:MySQL的备份形式可以分为如下几种:热备----即不停机备份冷备----需要关闭MySQL,然后备份其数据文件。(停机备份一般是直接拷

这片博文主要用来介绍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.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: 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 a
                      single transaction. Works ONLY for tables stored in
                      storage engines which support multiversioning (currently
                      only InnoDB does); the dump is NOT guaranteed to be
                      consistent for other storage engines. While a
                      --single-transaction dump is in process, to ensure a
                      valid dump file (correct table contents and binary log
                      position), no other connection should use the following
                      statements: ALTER TABLE, DROP TABLE, RENAME TABLE,
                      TRUNCATE TABLE, as consistent snapshot is not isolated
                      from 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  

切记在备份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的参数)

 


推荐阅读
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
author-avatar
树上的女爷
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有