MySQL备份工具之mysqldump

守給你的承諾、 提交于 2020-01-09 14:12:31

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

前言:

一直使用mysqldump进行数据备份,但是对这个工具一直感觉很陌生。今天我就具体的撕一撕关于备份那些事

 

 

一、我们为什么要备份?

 

做灾难恢复:比如操作系统故障、电源故障、硬件有问题、一个不经意的bug导致数据损坏等意想不到的灾难

需求改变:删除数据后想恢复或者要把数据还原到以前

测试需要 :测试需要,可能会定期将线上环境同步到测试环境

 

备份的目的就是为了恢复。同时没有备份的后果也是很严重的:数据会丢失、业务停掉、用户丢失、甚至项目不存在、you get out

 

 

二、备份需要考虑的因素有哪些

 

在线备份还是离线备份

在线备份要考虑:锁的时间、备份时间、备份时业务和负载

 

是逻辑备份还是物理备份

逻辑备份要考虑:备份时系统开销。备份前后数据一致性(浮点数有可能恢复后数据不一样)。逻辑备份需要加载和解释语句,转化为存储过程,建索引,所以会很慢。

物理备份要考虑:innodb的原始文件通常比逻辑备份要大的多。物理备份不总是可以跨平台、操作系统、版本。大小写敏感、浮点格式可能会遇到麻烦

 

备份什么

非显著数据:二进制日志和innodb事务日志

代码:如触发器和存储过程

服务器配置:最好备份中带有服务器配置或者有单独的服务器配置信息

 

 

三、备份的类型有那几种?

 

1、根据在线还是离线

冷备(cold backup):需要关mysql服务,读写请求均不允许状态下进行;
温备(warm backup): 服务在线,但仅支持读请求,不允许写请求;
热备(hot backup):备份的同时,业务不受影响。

PS:

这种类型的备份取决于业务需求,而不是备份工具

MyISAM不支持热备,innoDB支持热备,但是需要特殊的工具

 

2、根据备份的范围

完全备份:full backup,备份全部字符集。
增量备份: incremental backup 上次完全备份或增量备份以来改变了的数据,不能单独使用,要借助完全备份,备份的频率取决于数据的更新频率。
差异备份:differential backup 上次完全备份以来改变了的数据。
建议的恢复策略:
完全+增量+二进制日志
完全+差异+二进制日志

 

3、根据备份数据或文件

物理备份:直接备份数据文件

优点:

备份和恢复操作都比较简单,能够跨mysql的版本、平台和操作系统
恢复速度快,不需要执行任何SQL和构建索引

缺点:

innodb的原始文件通常比逻辑备份要大的多。物理备份不总是可以跨平台、操作系统、版本。大小写敏感、浮点格式可能会遇到麻烦
mysql>check tables;检测表是否可用


逻辑备份: 备份表中的数据和代码

优点:

l  查看和恢复都很简单,可以使用编辑器或者sed、grep等命令操作

l  可以远程备份和恢复,可以在云平台上恢复

l  备份非常灵活,可选参数很多,比如用where限制备份

l  与存储引擎无关,可以在innoDB引擎备份,在MyISAM引擎恢复,工作量少

l  有助于避免数据损坏,当磁盘驱动器有故障需要恢复时,逻辑备份就很最重要了

缺点:

l  备份或恢复都需要mysql服务器进程参与,消耗系统资源,可能会出现挤压内存和性能抖动等

l  逻辑备份在某些场景下比数据库文件本身大(例,一个整型需要4字节存储,但是用ASCII写入时,可能需要12个字符)

l  逻辑备份需要加载和解释语句,转化为存储过程,建索引,所以会很慢。

l  备份的时候不能有DDL操作,

 

 

四、常用的备份工具有哪些?备份的对象是什么

 

官方的工具:mysqldump、mysqlpump

Percona工具:xtrabackup、mydumper(mysql5.7才有的)

商业备份工具:Innobase:提供了商业备份工具为Innobackup,可以实现InnoDB的热备支持增量备份;但是对于MyISAM不支持增量备份,只能实现完全备份,属于物理备份,速度比较快。

 

备份的对象主要有:数据、配置文件、代码:存储过程,存储函数,触发器、os相关的配置文件、复制相关的配置、二进制日志

 

 

五、MySQL备份之into outfile和load data

 

主要用于单表或者单列,部分字段导出导入

##注意存放目录一定要有mysql启动的权限(也可以单列导出、导入)

mysql> select * from test01 into outfile '/data/mysql/mysql3306/test01.sql';

Query OK, 3 rows affected (0.06 sec)

##恢复

mysql> load data infile '/data/mysql/mysql3306/test01.sql' into table test01;

Query OK, 3 rows affected (0.08 sec)

Records: 3  Deleted: 0  Skipped: 0  Warnings: 0

##导出cvs格式文件

mysql> select * from test01 into outfile '/data/mysql/mysql3306/test01.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';

Query OK, 3 rows affected (0.00 sec)

案例:有时候有excel打开的时候会出现乱码, 
解决导出csv中文乱码问题:

将csv用txt打开,另存为,选择utf8编码即可。

 

解决导入问题:

mysql安装目录下的my.ini,增加如下参数:

[client]
default-character-set=utf8

[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci

重启mysql服务。

 

 

##导入cvs格式文件

mysql> LOAD DATA INFILE '/data/mysql/mysql3306/456.cvs.csv' INTO TABLE test01 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';

Query OK, 3 rows affected (0.00 sec)

Records: 3  Deleted: 0  Skipped: 0  Warnings: 0
[root@mysql-01 ~]# iconv -f GBK -t utf-8 abc.txt -o def.txt   格式转换

注释:

FIELDS TERMINATED BY ',' 字段间分割符
OPTIONALLY ENCLOSED BY '"' 将字段包围 对数值型无效
LINES TERMINATED BY '\n' 换行符

以上备份需要file权限

 

六、MySQL备份之mysqldump

 

1、创建备份需要的账号

create user 'bkuser'@'localhost' identified by 'bkzhishuedu';
root@localhost [(none)]>grant reload, lock tables, process, replication client on *.* to 'bktom'@'10.0.0.%' identified by '123456';

Query OK, 0 rows affected, 1 warning (0.00 sec)
flush privileges;

 

2、数据表都是innodb的表全备

从库执行:

[root@mysql-02 ~]# mysqldump -uroot -p123456 --single-transaction --dump-slave=2 --events --routines --triggers --hex-blob --quick --databases pbs > dump.sql

GTID:

[root@mysql-02 ~]# mysqldump -uroot -p123456 --single-transaction --dump-slave=2 --events --routines --triggers --hex-blob --set-gtid-purged=OFF --databases pbs > dump.sql

 

主库执行:

[root@mysql-01 ~]# mysqldump -uroot -p123456 --single-transaction --master-data=2 --events --routines --triggers --hex-blob --quick --databases pbs > dump.sql

GTID:

[root@mysql-01 ~]# mysqldump -uroot -p123456 --single-transaction --master-data=2 --events --routines --triggers --hex-blob --set-gtid-purged=OFF --databases pbs > dump.sql

TIPS:

数据表有MyIsam表,先lock tables,然后再flush tables,确保数据索引都刷新到磁盘,然后再备份呢

 

3、用mysqlbinlog做增备

这个很简单就是把binlog文件拷贝一份,到时候可以按需要恢复。

 

 

参考文档:

http://www.cnblogs.com/wenanry/archive/2010/05/18/1737939.html

http://www.jb51.net/article/41570.htm

https://my.oschina.net/jettyWang/blog/719731

https://my.oschina.net/abcijkxyz/blog/721858

 

 

为了方便大家交流,本人开通了微信公众号,和QQ群291519319。喜欢技术的一起来交流吧

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!