mysqldump逻辑备份

一、了解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 常用备份选项

选项 说明
-A,–all-databases 备份所有库
-B, --databases 备份多个数据库
-F, --flush-logs 备份之前刷新binlog日志
–default-character-set 指定导出数据时采用何种字符集,如果数据表不是采用默认的latin1字符
集的话,那么导出时必须指定该选项,否则再次导入数据后将产生乱码问题。
–no-data,-d 不导出任何数据,只导出数据库表结构。
–lock-tables 备份前,锁定所有数据库表
–single-transaction 保证数据的一致性和服务的可用性
-f, --force 即使在一个表导出期间得到一个SQL错误,继续。

二、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/my.cnf
secure_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/my.cnf     --进入mysql配置文件后添加如下语句开启binlog日志
log-bin=/var/log/mysql-bin/mylog    --如果不指定路径默认在/var/lib/mysql
server-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'

在这里插入图片描述

四、总结

  • 首先得了解什么是物理备份和逻辑备份,两者的备份特点。物理备份就是直接复制实际数据库文件,备份恢复的速度比较快,该方式适用于大型数据库环境,不受存储引擎的限制,但其占用空间较大。物理备份又可分为热备、冷备和温备三种备份方式。热备可在线备份、冷备需关闭数据库再备份、温备针对myisam的备份,备份时只读不写。
  • 逻辑备份备份的是在数据库中执行相关操作的SQL语句,比如DDL、DML、DCL以及DQL语句等。在恢复的时候执行备份的SQL语句实现数据库数据的重现。
  • 备份库和表都是使用mysqldump,恢复数据库和表时使用mysql。备份多张表是,表与表之间用空格分开,不需要添加其他参数,当添加-d参数时表示只备份表结构;备份多个库时,也是库与库之间用空格隔开,但需要添加相应参数,-B表示备份多个库,-A表示备份所有库。
  • 既可以导出表结构,又可以导出表记录。导出表记录时,会被导出到默认的/var/lib/mysql-files/目录下,当然这个路径可通过修改mysql配置文件修改。
  • 最后我觉得比较重要的是如何去看日志,其实看日志不一定非得把整篇英文都翻译下来,最重要的是抓住关键字,像在binlog日志中,你得注意去看起始位置和结束位置中的相关内容,比如它会记录你进入数据库,在库中建表等SQL语句。当我们误操作删除一些比较重要的表时,可以通过日志来回溯追踪,从而恢复数据。

猜你喜欢

转载自blog.csdn.net/IT_ZRS/article/details/108174581