MySQL备份与恢复-mysqldump备份与恢复
这片博文主要用来介绍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备份与恢复相关推荐
- MySQL日志、备份与恢复
文章目录 概述 mysql日志文件 错误日志 二进制日志 中继日志 慢查询日志 查询命令 备份类型 从物理与逻辑的角度分类 从数据库的备份策略角度分类 完全备份 差异备份 增量备份 备份方法 物理冷备 ...
- mysql运维管理-mysqldump 备份与恢复数据库20
mysqldump 备份与恢复数据库 备份: 1.备份全部数据库的数据和结构 mysqldump -uroot -pjsb -A > /bk/all.sql -A: 备份所有数据库=--all- ...
- mysql数据库mysqldump还原_mysqldump数据库备份与恢复
mysqldump -u 用户名 -p 数据库名> 备份的文件名 本文中因服务器为多实例,所以在执行登陆等命令时指定了-S参数,即指定其中一个数据库 备份: mysqldump -u root ...
- mysql对数据库进行备份吗_怎么对MySQL数据库进行备份与恢复
MySQL的备份与恢复 前言:前面我们已经了解了 MySQL 数据库的安装及使用,但随着自动化办公与电子商务的不断发展,企业对信息系统的依赖性越来越高,而 数据库 在信息系统中担任着非常重要的角色.尤 ...
- 360隔离mysql恢复_MySQL备份与恢复
博文目录 一.MySQL完全备份与恢复 二.数据库备份类型 三.常见的备份方法 四.数据库完全备份操作 五.MySQL增量备份与恢复 一.MySQL完全备份与恢复 备份的主要目的是灾难恢复,备份还可以 ...
- MySQL数据库之备份与恢复
目录 引言 一.MySQL日志管理 1.日志的类型与作用 redo 重做日志 undo 回滚日志 errorlog 错误日志 slow query log 慢查询日志 bin log 二进制日志 re ...
- MySQL之Xtrabackup备份与恢复
MySQL之Xtrabackup备份与恢复 一.Xtrabackup介绍 MySQL冷备.mysqldump.MySQL热拷贝都无法实现对数据库进行增量备份.在实际生产环境中增量备份是非常实用的,如果 ...
- 数据库(mysql)之备份与恢复
目录 一.MySQL日志管理 1.日志类型与作用 1.redo (重做日志) 2.undo(回滚日志) 3.errorlog(错误日志)☆ 4.slow query log(慢查询日志)☆ 5.bin ...
- mysql数据库的备份与恢复PPT_mysql数据库的备份与恢复
mysql数据库的备份与恢复 mysqldump命令用于备份数据库数据 格式为:mysqldump [参数][数据库名称] 如果是用mysqldump 来做备份.那么备份用户的相关权限如下: crea ...
最新文章
- WC2018集训 吉老师的军训练
- SAP零售业解决方案
- CodeCombat编程游戏
- (九)栈上分配与逃逸分析
- vb子程序未定义怎么改怎么办_提示子程序或函数未定义怎么修改。。。
- 主机主浏览服务器宣告的运作原理机制
- CPU版本文本分类代码 寒老师
- win10怎么重装系统虚拟机win7
- 镜头分割:像素域方法综述
- python+sklearn利用特征文件来训练和测试模型并使用joblib方法持久化存储模型
- nginx平滑重启与平滑升级的方法
- vue 中如何引入字体(思源黑体)
- iweboffice文档内容服务器文件,iWebOffice2015使用常见问题-NTKOOffice文档控件.doc
- ZLG USBCAN-II+ Linux驱动安装make报错问题
- R语言manova函数多元方差分析(MANOVA)、单因素多元方差分析的两个假设是多元正态性和方差-协方差矩阵的齐性、QQ图评估多元正态性、mvoutlier包中的aq.plot函数检验多变量异常值
- 微信公众号网页授权登录完整步骤版学不会你打我....
- 医院计算机培训ppt,计算机培训讲义.ppt
- 二极管(二):肖特基二极管
- 【区块链论文阅读】A Weak Consensus Algorithm and Its Applic
- IE浏览器-官网下载地址
热门文章
- 这是一个沙雕题II(思维好题)
- mysql中存储日期的类型_选择合适的 MySQL 日期时间类型来存储你的时间
- android accessibilityservice 被报病毒,无障碍功能AccessibilityService,卡顿,一直报warning...
- python正则表达式快速入门_Python学习笔记——正则表达式入门
- 【Transformer】TransMix: Attend to Mix for Vision Transformers
- 目标检测 dcn v2_使用Detectron2分6步进行目标检测
- 发布md 的文章测试
- vba 提取 json某个值_Excel中提取不重复值的方法汇总(5种基础+VBA+1个自定义函数)...
- dijkstra算法_Python实现图的经典DFS、BFS、Dijkstra、Floyd、Prim、Kruskal算法
- delphi打印html文件路径,Delphi获取文件名、不带扩展名文件名、文件所在路径、上级文件夹路径的方法...