mysqldump逻辑备份工具我在Mysql数据库实现备份与数据恢复简单提到过,不过我记得那篇文章没有提到物理备份和逻辑备份的区别和对应的备份方式,当时使用的完全备份、增量备份、差异备份都是属于物理备份,下面会给大家讲一讲。mysqldump是mysql自带的逻辑备份工具,可以保证数据的一致性和服务的可用性。在备份的时候进行行锁和自动锁表,锁住之后再备份。在使用mysqldump备份数据库时避免锁表,对一个正在运行的数据库进行备份时,若定要在服务运行期间备份,可添加–single-transaction选项。
(1)物理备份
我想物理备份大家应该都不难理解,其实物理备份就是直接复制实际数据库文件,该方式适用于大型数据库环境,不受存储引擎的限制。一般来说,物理备份恢复的速度比较快,但占用空间比较大,而且数据恢复时不能恢复到不同版本的Mysql数据库。物理备份又可分为热备、冷备和温备三种备份方式。
(2)逻辑备份
对于逻辑备份来说,其备份的是在数据库中执行相关操作的SQL语句,比如DDL、DML、DCL以及DQL语句等, 在恢复的时候执行备份的SQL语句实现数据库数据的重现。
选项 | 说明 |
---|---|
-A,–all-databases | 备份所有库 |
-B, --databases | 备份多个数据库 |
-F, --flush-logs | 备份之前刷新binlog日志 |
–default-character-set | 指定导出数据时采用何种字符集,如果数据表不是采用默认的latin1字符 集的话,那么导出时必须指定该选项,否则再次导入数据后将产生乱码问题。 |
–no-data,-d | 不导出任何数据,只导出数据库表结构。 |
–lock-tables | 备份前,锁定所有数据库表 |
–single-transaction | 保证数据的一致性和服务的可用性 |
-f, --force | 即使在一个表导出期间得到一个SQL错误,继续。 |
语法:mysqldump -u数据库登录用户 -p'数据库登录密码' 数据库名 表名 > 备份表至指定的路径
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
这里不再截图,和上述步骤一样。
mysqldump -u数据库登录用户 -p'数据库登录密码' 数据库名 > 备份库至指定的路径
以UUID数据库为测试数据:
mysqldump -uroot -p'ZRSanqy@123' UUID > /mysqldump/test2.bak
语法:mysqldump -u数据库登录用户 -p'数据库登录密码' -B 库1 库2 ... > 备份库至指定的路径
语法:mysqldump -u数据库登录用户 -p'数据库登录密码' -A > 备份库至指定的路径
备份多个库和所有库方法都一样的,无非备份多个库、所有库添加一些参数而已。
(1)删除UUID库(用于测试效果)
drop database UUID;
create database UUID;
语法:mysql -u数据库登录用户 -p'数据库登录密码' 数据库名 < 备份库时指定的路径
mysql -uroot -p'ZRSanqy@123' UUID < /mysqldump/test2.bak
(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
语法:mysqldump -u数据库登录用户 -p'数据库登录密码' -d 数据库名 表名 > 备份表结构至指定的路径
mysqldump -uroot -p'ZRSanqy@123' -d UUID test > /mysqldump/biao.bak
vim /mysqldump/biao.bak --看一下备份的数据,会发现只有创表的语句,说明只备份了表的结构
(1)在mysql实例中创建DB库
create database DB;
语法:mysql -u数据库登录用户 -p'数据库登录密码' -D DB < 备份表结构时指定的路径
mysql -uroot -p'ZRSanqy@123' -D DB < /mysqldump/biao.bak
既然可以导出表的结构和导入表的结构,自然也可以导出表的记录和导入表的记录。当然了,像这种导出、导入表结构和表记录在实际应用中是很少用的,备份的时候我们一般都是直接备份出整个表,包括什么表结构、表记录、索引等等。
一般在导出表记录的时候会导入到一个安全文件目录中,其路径为:/var/lib/mysql-files/。该路径可自定义,也可不用改动,接下来我们可以自定义一下。
mkdir /mysql_table
chown mysql.mysql /mysql_table/
vim /etc/my.cnf
secure_file_priv=/sql --在[mysql]中追加这条语句
systemctl restart mysqld
mysql> select * from t1 into outfile '/mysql_table/table.t1.bak';
cat /mysql_table/table.t1.bak
delete from t1; --删除表中记录
load data infile '/mysql_table/table.t1.bak' into table t1; --导入表记录
select * from t1; --查看表记录是否导入成功
注意
如果想将数据导入别的表,需要创建这个表并创建相应的表结构。
(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 --重启服务
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;
mysqlbinlog --start-position 219 --stop-position 333 mylog.000002 | mysql -uroot -p'ZRSanqy@123'