mysqldump工具使用

mysqldump

mysqldump官网文档

mysqldump客户实用程序执行逻辑备份,产生一组能够被执行以再现原始数据库对象定义和表数据的SQL语句。它转储一个或多个MySQL数据库以进行备份或转移到另一台SQL服务器。

mysqldump 命令也可以生成CSV输出,其他分隔符的文本或XML格式。

是MySQL数据库自带的一款命令行工具,mysqldump属于单线程,功能是非常强大的,不仅常被用于执行数据备份任务,甚至还可以用于数据迁移。

逻辑备份工具,适用所有引擎,温备;支持完全或部分备份;对innodb存储引擎支持热备,结合binlog的增量备份

建议使用管理员用户登录进行备份,备份时需要访问各种表和库,需要有权限

mysqldump工具
客户端工具,通过mysql协议连接至mysql服务器进行备份,要求数据库正在运行中

mysql [option] -B DB1 [DB2 DB3...]
mysql [option] -A [option]

mysqldump常用选项
mysqldump完整选项

-u:指定用户
-h:指定主机
-p:指定密码
-P:指定端口
-B:指定单个或多个数据库,只备份指定数据库的数据
-A:备份全部数据库,包括mysql、test、等系统自带的和自创建的数据库,包括存储过程之类的都会备份
-E:备份相关的计划任务
--tables:备份指定表,需要先-B指定在哪个数据库下
-R:备份所有存储过程和自定义函数,这些生产中用的不是太多
--triggers:备份表相关触发器,默认启用,用--skip-triggers,不备份触发器,用的不太多

--default-character-set=utf8	
	指定字符集,备份时要查看当前数据库的字符集,如果开发改了,那么备份出来的数据是不能还原的,一定要相同的字符集,要不然乱码

--master-data:此选项须启用二进制日志,此项和主从复制相关
	值为1:所备份的数据之前加一条记录为change master to语句,非注释。不指定数字时默认为1
	值为2:记录为注释的change master to语句,此选项会自动关闭--lock-tables功能,自动打开-x|--lock-all-tables功能,除非开启--single-transaction
	
	1和2的区别:如果是主从复制就等于1,不需要主从复制单纯备份就等于2
	此项是说明备份是从哪个时间点开始的备份,以确保不会多备份,也不会少备份,根据得到文件号和字段数,可区分出哪些是旧数据,哪些是新添加的

-F:备份前滚动日志,锁定表完成后,执行flushlogs命令,生成新的二进制日志文件,配合-A和-B选项时,会导致刷新多次数据库。、
	建议在同一时刻执行准储和日志刷新,可通过和--single-transaction或-x,--master-data一起使用实现,此时只刷新一次日志
	-F带来的好处就是将旧的二进制日志和新的二进制日志进行了分离,旧的日志文件就暂时没用,待确定没用就可以删除了。
	推介使用

--compact	:去掉注释,适合调试使用,生产中不使用
-d:只备份表结构,不备份数据
-t:只备份数据,不备份createtable
-n:不备份create database,此项可被-A或-B覆盖
--flush-privileges:备份mysql或相关时需要使用
-f:忽略SQL错误,继续执行
--hex-blob:使用十六进制符号转储二进制列,当有包括binary,varbinary,blob,bit的数据类型的列时使用,避免乱码
-q:不缓存查询,直接输出,加快备份速度

此链接中有示例库、示例表及表内容

命令示例

默认并不是备份,只是将所有的信息输出到屏幕,内容包括表的格式创建,表记录的添加
mysqldump hello

全库备份
关键选项:-A

mysqldump -A > all_bak.sql
	
mysqldump -A --master-data > all_bak.sql	
	使用上面命令执行,文件中会出现下面一句SQL语句:
	CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=3357;
		此语句说明了在mysql-bin.000002此文件的3357段之前都是旧数据,从3357段往后都是新数据,如果数据库故
	障,二进制日志文件不需要全部执行一遍,只要挑出3357段后边的内容重定向一个.sql文件,再加上新的二进制日志文
	件,全部追加到一个文件,再执行就可以恢复数据了,

mysqldump -A -F > all_bak1.sql	
	-A所有数据库,-F备份时滚动二进制日志文件。
	所以,-A指定的有几个数据库,那么-F就滚动几次日志文件

mysqldump -A --master-data -F > all_bak1.sql
	配合--master-data可以只滚动一次数据库,上面选项有说明
	
mysqldump -A -d > all_bak2.sql
	备份全库,而备份时只备份库中表结构,不备份表数据,也就是只有create table,没有insert记录
	
mysqldump -A -t > all_bak2.sql:只有数据,没有表结构
	适用:如果将来创建表的结构有错误,可以使用-d和-t将数据和表结构分离,然后修改-d备份的表结构文件,将字
符集等修改好,然后倒入,再将数据导入即可,不需要重新创建

单库备份
关键选项:-B

mysqldump -B hello > hello_bak.sql		-B指定单个或多个数据库备份
	mysql > hello_bak.sql				导入数据库,恢复表和表内数据
	
mysqldump -B hello | xz > hello_bak.sql.xz	
	备份单库hello,形成压缩格式的备份文件,占用空间小,恢复时解压在导入就可以了
	xz -d hello_bak.sql.xz				解压,生产中常用压缩形式的,节约空间
	mysql < hello_bak.sql				导入

分库备份

mysql -e 'show databases' | grep -Ev '^(Database|information_schema|performance_schema)$'|sed -r 's#(.*)#mysqldump -B \1 > /data/\1_bak.sql#' |bash
	
for db in `mysql -e 'show databases' | grep -Ev '^(Database|information_schema|performance_schema)$'`;do mysqldump -B $db --master-data=2 | gzip > /data/${db}_bak`date +%F`.sql.gz;done

单表备份
关键选项:-B、–tables

mysqldump -B hello --tables student > hello-student.sql	
 	备份单表是要先-B指定数据库的位置,然后--tables指定表

mysqldump -B hello --tables student -d > hello-student-d.sql
	只备份表结构

mysqldump -B hello --tables student -t > hello-student-t.sql
	只备份表数据

备份策略推介

myisam备份选项
支持温备,不支持热备,所以必须先锁定要备份的库,而後启动备份操作
锁定方法如下:建议使用此项

-x,--lock-all-tables
	加全局读锁,锁定所有库的所有表,同时加--single-transaction或--lock-tables选项会关闭此选项功能
	注意:当数据量较大时,可能会导致长时间无法并发访问数据库
	
-l,--lock-tables
	对于需要备份的每个数据库,在启动备份之前分别锁定其所有表,默认为on,--skip-lock-tables选项可禁用,对备
份myisam的多个库,可能会造成数据不一致,不建议使用
	注:以上选项对innodb表一样生效,实现温备,但不推介使用
	innodb有热备,又不会影响用户使用,当然使用热备,不使用温备

innodb备份选项:支持热备,可用温备但不建议用

--single-transaction
	此选项innodb中推介使用,不适用myisam(mysql数据库默认存储引擎是myisam存储引擎)。
	此选项开始前,先执行begin指令开启事务,不加此选项就不是以事务方式开始的备份	
	此选项通过在单个事务中转储所有表来创建一支的快照
	仅适用于存储在支持多版本控制的存储引擎中的表,目前只有innodb可以
	转储不保证与其他引擎一致
	在进行单事务转储时,要确保有效的转储文件(正确的表内容和二进制日志位置),要确保没有其他链接使用以下语句alter、drop、rename、truncate
备份大型表时,建议将--single-transaction选项和-q|--quick结合使用

innodb建议备份策略

mysqldump -uroot -A -F --single-transaction --master-data=1 --flush-privileges --default-character-set=utf8mb4 --hex-blob > /data/allbak_`date +%F`.sql

设置字符集的时候一定要先确认数据库用的是什么字符集,然后指定相同的字符集,要不然会出现乱码,数据也不能恢复了

myisam建议备份策略

mysqldump -uroot -A -F --master-data=1 --flush-privileges --default-character-set=utf8mb4 --hex-blob > /data/allbak_`date +%F`.sql

使用mysqldump备份数据库并通过备份二进制日志还原数据(备份完后再写入数据,然后再删库)

备份前准备

使用的数据库版本是centos7镜像默认带的mariadb-server-5.5.60-1.el7_5.x86_64
默认安装上是没有其他示例库和表的,可使用我上面推介的链接中创建示例库和表
要开启二进制日志文件记录,因为我们要根据它恢复

编辑二进制日志启动记录

vim /etv/my.cnf

[mysqld]
log-bin
binlog-format=row

重启服务

已有环境

导入示例库和表:
MariaDB [(none)]> source /root/hello.sql

MariaDB [hello]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hello              |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

# 查看日志记录
MariaDB [test]> show master logs;
+--------------------+-----------+
| Log_name           | File_size |
+--------------------+-----------+
| mariadb-bin.000001 |   1017695 |
+--------------------+-----------+
1 row in set (0.00 sec)

使用mysqldump备份数据库

 mysqldump -A -F --single-transaction --master-data > /root/all.backup.sql

进入数据库查看现有状态

MariaDB [test]> use hello
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [hello]> show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| student         |
| teacher         |
+-----------------+
2 rows in set (0.00 sec)

MariaDB [hello]> select * from student;
+----+--------------+------+------+-------------+-------+
| id | name         | age  | sex  | phone       | class |
+----+--------------+------+------+-------------+-------+
|  1 | Bai zhantang |   24 | M    | 10086       |     1 |
|  2 | Tong xiangyu |   23 | F    | 10010       |  NULL |
|  3 | Guo furong   |   21 | F    | 11010       |     2 |
|  4 | Li dazui     |   28 | M    | 12030       |  NULL |
|  5 | Mo xiaobei   |   15 | F    | 13041       |     1 |
|  6 | Lu xiucai    |   22 | M    | 10001       |  NULL |
|  7 | Yan xiaoliu  |   20 | M    | NULL        |     2 |
|  8 | Xing yusen   |   29 | M    | NULL        |     1 |
|  9 | Lu wushuang  |   19 | F    | NULL        |  NULL |
| 10 | Yin cheng    |   25 | M    | NULL 		|     2 |
| 11 | Li ning      |   25 | F    | NULL 		|  NULL |
| 12 | Zhao shuai   |   26 | M    | NULL        |  NULL |
| 13 | Bao zheng    |   33 | M    | NULL        |     2 |
| 14 | Liu yifei    |   19 | F    | NULL        |  NULL |
| 15 | Yang mi      |   29 | F    | NULL        |     2 |
| 16 | Liu yan      |   23 | F    | NULL        |     2 |
| 17 | Hu ge        |   33 | M    | NULL        |  NULL |
| 18 | Sun wukong   |  100 | M    | NULL        |  NULL |
| 19 | Zhou xingchi |   55 | M    | NULL        |  NULL |
| 20 | Liu dehua    |   57 | M    | NULL        |  NULL |
+----+--------------+------+------+-------------+-------+
20 rows in set (0.00 sec)

添加数据

insert student (name,age,sex) value('aaa',33,'F'),('bbb',44,'M'),('ccc',55,'F'),('ddd',66,'M');

查看
	MariaDB [hello]> select * from student;                                       
	| id | name         | age  | sex  | phone       | class |
	+----+--------------+------+------+-------------+-------+
	|  1 | Bai zhantang |   24 | M    | 10086       |     1 |
	|  2 | Tong xiangyu |   23 | F    | 10010       |  NULL |
	|  3 | Guo furong   |   21 | F    | 11010       |     2 |
	|  4 | Li dazui     |   28 | M    | 12030       |  NULL |
	|  5 | Mo xiaobei   |   15 | F    | 13041       |     1 |
	|  6 | Lu xiucai    |   22 | M    | 10001       |  NULL |
	|  7 | Yan xiaoliu  |   20 | M    | NULL        |     2 |
	|  8 | Xing yusen   |   29 | M    | NULL        |     1 |
	|  9 | Lu wushuang  |   19 | F    | NULL        |  NULL |
	| 10 | Yin cheng    |   25 | M    | NULL 		|     2 |
	| 11 | Li ning      |   25 | F    | NULL 		|  NULL |
	| 12 | Zhao shuai   |   26 | M    | NULL        |  NULL |
	| 13 | Bao zheng    |   33 | M    | NULL        |     2 |
	| 14 | Liu yifei    |   19 | F    | NULL        |  NULL |
	| 15 | Yang mi      |   29 | F    | NULL        |     2 |
	| 16 | Liu yan      |   23 | F    | NULL        |     2 |
	| 17 | Hu ge        |   33 | M    | NULL        |  NULL |
	| 18 | Sun wukong   |  100 | M    | NULL        |  NULL |
	| 19 | Zhou xingchi |   55 | M    | NULL        |  NULL |
	| 20 | Liu dehua    |   57 | M    | NULL        |  NULL |
	| 21 | aaa          |   33 | F    | NULL        |  NULL |
	| 22 | bbb          |   44 | M    | NULL        |  NULL |
	| 23 | ccc          |   55 | F    | NULL        |  NULL |
	| 24 | ddd          |   66 | M    | NULL        |  NULL |
	+----+--------------+------+------+-------------+-------+

查看binlog位置,并备份

MariaDB [hello]> show master logs;
	+--------------------+-----------+
	| Log_name           | File_size |
	+--------------------+-----------+
	| mariadb-bin.000001 |   1017740 |
	| mariadb-bin.000002 |       460 |
	+--------------------+-----------+
因为我们前边全备是指定了-F滚动日志,所以只需要备份后来的mariadb-bin.000002的二进制即可

mysqlbinlog使用方法

mysqlbinlog --start-position=245 /var/lib/mysql/mariadb-bin.000002 > /root/binlog.sql 
	 --start-position=245 指定日志其实位置,默认滚动后是245开始

查看,现在/root下应该有两个文件
	all.backup.sql		binlog.sql

破坏,删库跑路

rm -rf /var/lib/mysql/*

重启服务:systemctl restart mariadb,数据库恢复到初始状态
登录查看
	MariaDB [(none)]> show databases;
	+--------------------+
	| Database           |
	+--------------------+
	| information_schema |
	| mysql              |
	| performance_schema |
	| test               |
	+--------------------+
	4 rows in set (0.00 sec)

全备还原

# source导入还原
MariaDB [(none)]> source /root/all.backup.sql

# 查看,当前数据库已经恢复
MariaDB [test]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hello              |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

# 切换数据库
MariaDB [test]> use hello
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
# 查看表数据只恢复了一部分
MariaDB [hello]> select * from student;
+----+--------------+------+------+-------------+-------+
| id | name         | age  | sex  | phone       | class |
+----+--------------+------+------+-------------+-------+
|  1 | Bai zhantang |   24 | M    | 10086       |     1 |
|  2 | Tong xiangyu |   23 | F    | 10010       |  NULL |
|  3 | Guo furong   |   21 | F    | 11010       |     2 |
|  4 | Li dazui     |   28 | M    | 12030       |  NULL |
|  5 | Mo xiaobei   |   15 | F    | 13041       |     1 |
|  6 | Lu xiucai    |   22 | M    | 10001       |  NULL |
|  7 | Yan xiaoliu  |   20 | M    | NULL        |     2 |
|  8 | Xing yusen   |   29 | M    | NULL        |     1 |
|  9 | Lu wushuang  |   19 | F    | NULL        |  NULL |
| 10 | Yin cheng    |   25 | M    | NULL 		|     2 |
| 11 | Li ning      |   25 | F    | NULL 		|  NULL |
| 12 | Zhao shuai   |   26 | M    | NULL        |  NULL |
| 13 | Bao zheng    |   33 | M    | NULL        |     2 |
| 14 | Liu yifei    |   19 | F    | NULL        |  NULL |
| 15 | Yang mi      |   29 | F    | NULL        |     2 |
| 16 | Liu yan      |   23 | F    | NULL        |     2 |
| 17 | Hu ge        |   33 | M    | NULL        |  NULL |
| 18 | Sun wukong   |  100 | M    | NULL        |  NULL |
| 19 | Zhou xingchi |   55 | M    | NULL        |  NULL |
| 20 | Liu dehua    |   57 | M    | NULL        |  NULL |
+----+--------------+------+------+-------------+-------+
20 rows in set (0.00 sec)

二进制还原

# source 导入还原
MariaDB [hello]> source /root/binlog.sql

# 再次查看表数据
MariaDB [hello]> select * from student; 
+----+--------------+------+------+-------------+-------+
| id | name         | age  | sex  | phone       | class |
+----+--------------+------+------+-------------+-------+
|  1 | Bai zhantang |   24 | M    | 10086       |     1 |
|  2 | Tong xiangyu |   23 | F    | 10010       |  NULL |
|  3 | Guo furong   |   21 | F    | 11010       |     2 |
|  4 | Li dazui     |   28 | M    | 12030       |  NULL |
|  5 | Mo xiaobei   |   15 | F    | 13041       |     1 |
|  6 | Lu xiucai    |   22 | M    | 10001       |  NULL |
|  7 | Yan xiaoliu  |   20 | M    | NULL        |     2 |
|  8 | Xing yusen   |   29 | M    | NULL        |     1 |
|  9 | Lu wushuang  |   19 | F    | NULL        |  NULL |
| 10 | Yin cheng    |   25 | M    | NULL 		|     2 |
| 11 | Li ning      |   25 | F    | NULL 		|  NULL |
| 12 | Zhao shuai   |   26 | M    | NULL        |  NULL |
| 13 | Bao zheng    |   33 | M    | NULL        |     2 |
| 14 | Liu yifei    |   19 | F    | NULL        |  NULL |
| 15 | Yang mi      |   29 | F    | NULL        |     2 |
| 16 | Liu yan      |   23 | F    | NULL        |     2 |
| 17 | Hu ge        |   33 | M    | NULL        |  NULL |
| 18 | Sun wukong   |  100 | M    | NULL        |  NULL |
| 19 | Zhou xingchi |   55 | M    | NULL        |  NULL |
| 20 | Liu dehua    |   57 | M    | NULL        |  NULL |
| 21 | aaa          |   33 | F    | NULL        |  NULL |
| 22 | bbb          |   44 | M    | NULL        |  NULL |
| 23 | ccc          |   55 | F    | NULL        |  NULL |
| 24 | ddd          |   66 | M    | NULL        |  NULL |
+----+--------------+------+------+-------------+-------+

添加的后面四个用户已经恢复

还原完成!!

发布了63 篇原创文章 · 获赞 0 · 访问量 2222

猜你喜欢

转载自blog.csdn.net/qq_43058911/article/details/103062093
今日推荐