目录
一、了解mysqldump工具1.1 物理备份和逻辑备份1.2 常用备份选项 二、mysqldump备份及恢复2.1 备份表2.2 备份库2.3 恢复库2.4 恢复表2.5 备份表结构2.6 恢复表结构 三、扩展3.1 导出表记录3.2 导入表记录3.3 binlog日志恢复数据 四、总结一、了解mysqldump工具
mysqldump逻辑备份工具我在Mysql数据库实现备份与数据恢复简单提到过,不过我记得那篇文章没有提到物理备份和逻辑备份的区别和对应的备份方式,当时使用的完全备份、增量备份、差异备份都是属于物理备份,下面会给大家讲一讲。mysqldump是mysql自带的逻辑备份工具,可以保证数据的一致性和服务的可用性。在备份的时候进行行锁和自动锁表,锁住之后再备份。在使用mysqldump备份数据库时避免锁表,对一个正在运行的数据库进行备份时,若定要在服务运行期间备份,可添加–single-transaction选项。
1.1 物理备份和逻辑备份
(1)物理备份
我想物理备份大家应该都不难理解,其实物理备份就是直接复制实际数据库文件,该方式适用于大型数据库环境,不受存储引擎的限制。一般来说,物理备份恢复的速度比较快,但占用空间比较大,而且数据恢复时不能恢复到不同版本的Mysql数据库。物理备份又可分为热备、冷备和温备三种备份方式。
热备(hot backup)
在线备份,即在备份时数据库处于运行状态,这种备份方法依赖于数据库的日志文件。其特点是:对应用基本无影响,但性能会有所下降,一般在做数据主从同步时,尽量不要在主库上备份,应在从库上备份。冷备(cold backup)
和热设备相对的一种备份方式,即需要停机再做备份,是在关闭数据库的时候进行的备份,其会备份数据库目录下的所有文件。温备(warm backup)
该备份方式针对myisam的备份,备份时只读不写,在数据库锁定表格的状态下进行的。其特点是:对应用影响较大,通常加一个读锁。
(2)逻辑备份
对于逻辑备份来说,其备份的是在数据库中执行相关操作的SQL语句,比如DDL、DML、DCL以及DQL语句等, 在恢复的时候执行备份的SQL语句实现数据库数据的重现。
1.2 常用备份选项
二、mysqldump备份及恢复
2.1 备份表
备份一张表语法:mysqldump -u数据库登录用户 -p'数据库登录密码' 数据库名 表名 > 备份表至指定的路径
(1)创建测试数据
(2)创建备份目录
mkdir /mysqldump
(3)备份数据库中的表
mysqldump -uroot -p'ZRSanqy@123' UUID test > /mysqldump/test.bak
查看一下备份后的数据:
备份多张表
语法:mysqldump -u数据库登录用户 -p'数据库登录密码' 数据库名 表1 表2 ... > 备份表至指定的路径
(1)创建备份目录
mkdir /mysqldump
(2)备份数据库中的表
mysqldump -uroot -p'ZRSanqy@123' UUID test1 test2 > /mysqldump/test1.bak
这里不再截图,和上述步骤一样。
2.2 备份库
备份一个库mysqldump -u数据库登录用户 -p'数据库登录密码' 数据库名 > 备份库至指定的路径
以UUID数据库为测试数据:
mysqldump -uroot -p'ZRSanqy@123' UUID > /mysqldump/test2.bak
备份多个库
语法:mysqldump -u数据库登录用户 -p'数据库登录密码' -B 库1 库2 ... > 备份库至指定的路径
备份所有库
语法:mysqldump -u数据库登录用户 -p'数据库登录密码' -A > 备份库至指定的路径
备份多个库和所有库方法都一样的,无非备份多个库、所有库添加一些参数而已。
2.3 恢复库
(1)删除UUID库(用于测试效果)
drop database UUID;
(2)先在mysql实例中创建UUID库
create database UUID;
(3)恢复UUID库
语法:mysql -u数据库登录用户 -p'数据库登录密码' 数据库名 < 备份库时指定的路径
mysql -uroot -p'ZRSanqy@123' UUID < /mysqldump/test2.bak
2.4 恢复表
(1)删除UUID库中的test表(假装误操作删掉了表)
(2)恢复test表
法一:为保证数据一致性,应在恢复数据之前停止数据库对外的服务,停止binlog日志,因为binlog使用binlog日
志恢复数据时也会产生binlog日志。
source /mysqldump/test1.bak --使用source恢复
法二:
语法:mysql -u数据库登录用户 -p'数据库登录密码' 数据库名 < 备份表时指定的路径
mysql -uroot -p'ZRSanqy@123' UUID < /mysqldump/test1.bak
2.5 备份表结构
语法:mysqldump -u数据库登录用户 -p'数据库登录密码' -d 数据库名 表名 > 备份表结构至指定的路径
mysqldump -uroot -p'ZRSanqy@123' -d UUID test > /mysqldump/biao.bak
vim /mysqldump/biao.bak--看一下备份的数据,会发现只有创表的语句,说明只备份了表的结构
2.6 恢复表结构
(1)在mysql实例中创建DB库
create database DB;
(2)恢复备份的表结构到DB库中
语法:mysql -u数据库登录用户 -p'数据库登录密码' -D DB < 备份表结构时指定的路径
mysql -uroot -p'ZRSanqy@123' -D DB < /mysqldump/biao.bak
三、扩展
3.1 导出表记录
既然可以导出表的结构和导入表的结构,自然也可以导出表的记录和导入表的记录。当然了,像这种导出、导入表结构和表记录在实际应用中是很少用的,备份的时候我们一般都是直接备份出整个表,包括什么表结构、表记录、索引等等。
一般在导出表记录的时候会导入到一个安全文件目录中,其路径为:/var/lib/mysql-files/。该路径可自定义,也可不用改动,接下来我们可以自定义一下。
创建导入路径
mkdir /mysql_table
修改属主、属组
chown mysql.mysql /mysql_table/
编辑配置文件修改默认路径
vim /etc/fsecure_file_priv=/sql --在[mysql]中追加这条语句
重启mysqld服务
systemctl restart mysqld
看看路径
导出表记录(上述步骤可省略)
mysql> select * from t1 into outfile '/mysql_table/table.t1.bak';cat /mysql_table/table.t1.bak
3.2 导入表记录
删除DB数据库中表t1中的记录(用来测试恢复效果)delete from t1; --删除表中记录
导入表记录
load data infile '/mysql_table/table.t1.bak' into table t1; --导入表记录select * from t1; --查看表记录是否导入成功
注意
如果想将数据导入别的表,需要创建这个表并创建相应的表结构。
3.3 binlog日志恢复数据
(1)首先开启binlog日志
vim /etc/f--进入mysql配置文件后添加如下语句开启binlog日志log-bin=/var/log/mysql-bin/mylog --如果不指定路径默认在/var/lib/mysqlserver-id=1 --主从复制的时候使用,为了防止相互复制,会设置一个ID,来标识谁产生的日志
mkdir /var/log/mysql-bin/mylog--添加目录chown mysql.mysql /var/log/mysql-bin/ --修改属主、属组权限systemctl restart mysqld--重启服务
(2)在UUID数据库中创建QQ表
mysql> use UUID;mysql> create table QQ(id int,name varchar(20));mysql> insert into QQ values(1,'hello');mysql> select * from QQ;
因为我事先已经开启了binlog日志,所以操作到这一步时,相关的SQL语句已经被记录到我的binlog日志中了,接下来就是删除QQ表,然后测试一下通过binlog是否可以恢复我的QQ表。
(3)从UUID数据库中删除QQ表
mysql> drop table QQ;mysql> show tables;
(4)通过binlog恢复UUID数据库中QQ表
mysqlbinlog --start-position 219 --stop-position 333 mylog.000002 | mysql -uroot -p'ZRSanqy@123'