Mysql的备份

Posted 礁之

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql的备份相关的知识,希望对你有一定的参考价值。

一、mysql备份

(1)binlog二进制日志概述

  • binlog二进制日志是mysql常用的备份数据库的方式
  • mysql数据库中的增、删、改的操作都会记录到binlog日志中,相当于二进制日志记录着一条条SQL语句,开启了binlog二进制日志后,备份数据库其实就是备份二进制日志,
  • 通过二进制日志去恢复数据,日志中的每条操作都有相应的时间和位置号,可以指定事件或者位置号去恢复数据库数据

(2)开启binlog二进制日志

[root@rzy ~]# vim /etc/my.cnf #修改mysql主配置文件  
  1 [mysqld]
  2 basedir = /usr/local/mysql
  3 datadir = /usr/local/mysql/data  #这个路径就是二进制日志存放的路径
  4 port = 3306
  5 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
  6 character_set_server=utf8
  7 init_connect='SET NAMES utf8'
  8 log-error=/usr/local/mysql/logs/mysqld.log
  9 pid-file=/usr/local/mysql/logs/mysqld.pid
 10 skip-name-resolve
 11 server-id = 1  #添加,开启二进制时,指定的id为1
 12 log-bin=mysql-bin #添加,开启二进制日志
#保存退出
[root@rzy ~]# systemctl restart mysqld #重启mysql服务
[root@rzy ~]# cd /usr/local/mysql/data/ #进入存放二进制日志的目录
[root@rzy data]# ls 
aaa       ib_buffer_pool  ib_logfile0  ibtmp1  mysql-bin.000001  mysqld_safe.pid     sys
auto.cnf  ibdata1         ib_logfile1  mysql   mysql-bin.index   performance_schema
————————————————————————————————————————————————————————————
#mysql-bin.000001这个就是二进制日志
#mysql-bin.index  这个可以查看mysql所有记录的二进制文件
————————————————————————————————————————————————————————————
[root@rzy data]# cat mysql-bin.index  #查看当前mysql操作记录的二进制文件是那个
./mysql-bin.000001   #可以看到当前mysql记录的二进制日志有000001

[root@rzy data]# mysqlbinlog mysql-bin.000001  #查看二进制日志需要使用mysqlbinlog命令查看,不然是乱码
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#210519 23:13:55 server id 1  end_log_pos 123 CRC32 0x203bbf20 	Start: binlog v 4, server v 5.7.12-log created 210519 23:13:55 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
MyulYA8BAAAAdwAAAHsAAAABAAQANS43LjEyLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAzK6VgEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
ASC/OyA=
'/*!*/;
# at 123
#210519 23:13:55 server id 1  end_log_pos 154 CRC32 0x92e7fa2e 	Previous-GTIDs
# [empty]
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

binlog日志内容作用:

  1. 记录了mysql数据的增、删、改的操作
  2. MySQL的主从复制就是基于二进制日志来进行同步的,slave服务器通过复制master服务器的二进制日志完成主从复制,在执行之前保存于中继日志(relay log)中
  3. slave从服务器通常可以关闭二进制日志从而提高服务器性能,因为从服务器主要是读主服务器发过来的二进制日志,它本身是不需要记录二进制日志的,所有可以关闭二进制日志功能从而提高性能

有两种情况,二进制日志会重新生成:

  1. 重启mysql服务
  2. 在MySQL服务器中使用flush logs;重置日志

注意!!!!:

在删除二进制日志时,只删除二进制日志是不行的,而且会导致mysql管理混乱,还会使mysql无法重新启动,故而在删除二进制日志时,要记得把mysql-bin.index中的内容也删除

(3)在mysql中查看二进制日志

mysql> show master status;  #查看当前的记录的二进制日志
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> flush logs;  #重置日志
Query OK, 0 rows affected (0.01 sec)

mysql> show master status; #再次查看发现变成了02号日志
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> exit
Bye
[root@rzy ~]# cat /usr/local/mysql/data/mysql-bin.index  #查看记录的日志,发现多了一个
./mysql-bin.000001
./mysql-bin.000002

(4)mysql二进制文件读取工具mysqlbinlog

命令格式:mysqlbinlog 选项 二进制日志路径

选项:

选项作用
–start-datetime用来指定二进制日志的起始日期 日期需要写成yyyy-mm-dd 00:00:00格式的
–stop-datetime用来指定二进制日志的结束日期
–start-position用来指定二进制日志的起始位置
–stop-position用来指定二进制日志的结束位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qLXCSXnX-1625533842204)(F:\\个人文档\\markdown图片\\image-20210519163939454.png)]

利用这些选项可以完成mysql的增量备份,一般都是配合and加上起始和结束日期来备份,以天来备份的

[root@rzy ~]# mysql -u root -p123123 #进入mysql
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \\g.
Your MySQL connection id is 3
Server version: 5.7.12-log Source distribution

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.

mysql> use aaa;
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
mysql> show tables;  #查看所有表
+---------------+
| Tables_in_aaa |
+---------------+
| aaa           |
| bbb           |
+---------------+
2 rows in set (0.01 sec)

mysql> drop table aaa; #删除两个表
Query OK, 0 rows affected (0.00 sec)

mysql> drop table bbb;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;  #再次查看确认删除
Empty set (0.00 sec)

mysql> exit
Bye

[root@rzy ~]# mysqlbinlog /usr/local/mysql/data/mysql-bin.000002  #使用mysqlbinlog命令查看
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#210519 23:48:49 server id 1  end_log_pos 123 CRC32 0x8d27bd79 	Start: binlog v 4, server v 5.7.12-log created 210519 23:48:49
# Warning: this binlog is either in use or was not closed properly.
BINLOG '
YTOlYA8BAAAAdwAAAHsAAAABAAQANS43LjEyLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AXm9J40=
'/*!*/;
# at 123
#210519 23:48:49 server id 1  end_log_pos 154 CRC32 0x4c53ba28 	Previous-GTIDs
# [empty]
# at 154
#210520  0:19:23 server id 1  end_log_pos 219 CRC32 0x24558e28 	Anonymous_GTID	last_committed=0	sequence_number=1
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 219
#210520  0:19:23 server id 1  end_log_pos 333 CRC32 0x3ce0596c 	Query	thread_id=3	exec_time=0	error_code=0
use `aaa`/*!*/;          
SET TIMESTAMP=1621441163/*!*/;
SET @@session.pseudo_thread_id=3/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
DROP TABLE `aaa` /* generated by server */  #这个就是删除aaa表的命令
/*!*/;
# at 333
#210520  0:19:25 server id 1  end_log_pos 398 CRC32 0x701d265b 	Anonymous_GTID	last_committed=1	sequence_number=2
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 398
#210520  0:19:25 server id 1  end_log_pos 512 CRC32 0xd93b7e48 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1621441165/*!*/;
DROP TABLE `bbb` /* generated by server */  #这个就是刚才删除bbb表的命令
/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[root@rzy ~]# mysqlbinlog --start-position 333 --stop-position 398 /usr/local/mysql/data/mysql-bin.000002 > /root/mysql-bin.sql  #从位置333到398的内容输出到新的二进制日志中
[root@rzy ~]# mysqlbinlog --start-datetime 2021-05-20 00:19:23 --stop-datetime 2021-05-20 00:19:25 /usr/local/mysql/data/mysql-bin.000002 > /root/mysql-date-bin.sql #利用时间来输出二进制日志内容
[root@rzy ~]# mysqlbinlog mysql-bin.sql  #查看新建的二进制日志,确认输出内容
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
ERROR: File is not a binary log file.
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

[root@rzy ~]# mysql -u root -p123123 < mysql-bin.sql  #恢复数据
mysql: [Warning] Using a password on the command line interface can be insecure. #这个是提示密码不安全

(5)二进制日志内容解释

[root@rzy ~]# mysqlbinlog /usr/local/mysql/data/mysql-bin.000002
# at 577
#210520  0:47:31 server id 1  end_log_pos 687 CRC32 0x1b302d07 	QueryQuery:记录类型
#thread_id=6	exec_time=0	error_code=0
SET TIMESTAMP=1621442851/*!*/;
create table aaa(id int,name char(10))
_________________________________________________________
#210520 0:47:31:时间点
#server id 1:服务器id,就是配置文件里的那个id
#Query:记录类型
#thread_id=6:线程号
#exec_time=0:语句的时间戳和写入二进制日志文件的时间差
#at 577:事件位置
#error_code=0:错误代码
#create table aaa(id int,name char(10)):事件内容一般z

(6)二进制日志格式

  • 二进制有三种格式分别是statement、row、mixed,是由bin_log_format定义的,可以在mysql中临时定义,也可以在配置文件中永久定义,
  • mysql5.7版本之前默认格式为statement,mysql5.7版本及之后默认格式为row,
  1. statement: 此格式是基于恢复语句的,使用这个格式二进制日志会记录在mysql中执行过的SQL语句。需要注意的是,如果执行的SQL语句使用了某种即时函数,例如current_date()这种表示当前时间的函数的话,在恢复数据时,会导致恢复数据的不一致

  2. row: 此格式是基于恢复行数据的,顾名思义就是恢复数据库的行数据,但是缺点就是如果数据库数据量大的话,恢复数据的量会很大

  3. mixed: 此格式是混合模式,使用这个模式会由mysql去自行定义恢复SQL语句还是行数据 (使用statement格式还是row格式)


mysql> show variables like "binlog_format";   #查看mysql当前二进制记录的格式
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.04 sec)

mysql> set session binlog_format=statement;   #临时修改二进制记录的格式为statement
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye
[root@rzy ~]# vim /etc/my.cnf 
  1 [mysqld]
  2 basedir = /usr/local/mysql
  3 datadir = /usr/local/mysql/data
  4 port = 3306
  5 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
  6 character_set_server=utf8
  7 init_connect='SET NAMES utf8'
  8 log-error=/usr/local/mysql/logs/mysqld.log
  9 pid-file=/usr/local/mysql/logs/mysqld.pid
 10 skip-name-resolve
 11 server-id = 1
 12 log-bin=mysql-bin
 13 binlog_format=ROW  #添加binlog_format=ROW永久指定mysql二进制日志格式为row
#保存退出
[root@rzy ~]# systemctl restart mysqld

建议:不要把二进制日志和数据文件放在同一个设备,可以将binlog二进制日志备份到其他设备上

(7)备份类型

在备份mysql数据时,根据多种情况可以分类成多种备份类型

  • 根据备份时,mysql服务是否可以正常进行读写
  1. 冷备份(cold backup):备份时需要停止mysql服务,mysql的读写操作都不能进行
  2. 温备份:备份时需要对全局(mysql的所有数据)施加共享锁,mysql只能进行读操作不能进行写操作
  3. 热备份(hot backup):备份时不需要停止mysql服务,mysql的读写操作可以正常进行
  • 根据备份时备份的数据是整个数据还是变化数据(数据集)
  1. 完全备份(full backup):备份整个mysql的数据,恢复时只需一次性恢复,备份和恢复简单,但是恢复时间长,备份时间也长,并且每一次进行完全备份会产生大量的重复数据,占用大量空间
  2. 增量备份(partial backup):只备份完全备份后增加的数据,例如:第一天把数据库进行了完全备份,第二天增加了数据A,增量备份只会备份数据A而不会把全部的数据在备份一遍,恢复时需要诶个恢复,如果中间的某一次备份数据损坏,将导致数据丢失
  3. 差异备份(differential backup):只备份完全备份之后修改过的所有文件,备份的时间起点是自完全备份开始,备份数据量会越来越大,恢复数据时,只需要恢复上一次的完全备份和最近一次的差异备份即可,例如:第一天把数据库进行了完全备份,第二天没有新数据,第三天增加了数据A,差异备份会只备份数据A,恢复时也是需要恢复完全备份和最后一次差异备份的数据A
  • 根据备份时的备份内容
  1. 物理备份(physical backup):物理备份会直接复制数据文件(即mysql的数据存储路径),并且打包归档

特点:物理备份不需要额外工具,直接使用归档命令既可以,但是跨平台能力比较差,如果数据量超过几十个G的话,则适用于物理备份

  1. 逻辑备份(logical backup):逻辑备份其实就是备份SQL语句,mysqldump就是逻辑备份

特点:可以使用文档编辑器进行编辑,导入数据库方便,直接读取SQL语句即可。逻辑备份恢复数据时间较慢,占用空间大,并且无法保证浮点数的精度,恢复完数据后还需重新建立索引

(8)备份的策略

在进行mysql的备份时,有以下因素需要考虑

  1. 备份方式
  2. 备份实践
  3. 备份成本
  4. 锁时间
  5. 使用时间
  6. 性能开销
  7. 恢复成本
  8. 恢复时间
  9. 可以容忍数据的最大丢失数量

(9)备份内容

在备份mysql时要备份的内容一般有:

  1. 数据库中的数据
  2. mysql的配置文件
  3. mysql中的代码:存储过程、存储函数、触发器
  4. OS相关的配置文件,crontab计划任务中的备份策略脚本
  5. 如果在主从复制的场景中。一般是备份跟复制相关的信息
  6. 二进制日志需要定期备份,一旦发现二进制日志出现问题,需要马上对数据进行完全备份

(10)Mysql最常用的三种备份工具

  1. mysqldump

通常为小数据情况下的备份,mysqldump是单线程备份,所以在恢复和备份时较慢,故通常只备份小数据

innoDB引擎支持:热备、温备

MyISAM、Aria引擎支持:温备

  1. Xtrabackup

Xtrabackup通常使用innobackupex工具,一般备份mysql大数据时使用,xtrabackup属于物理备份,备份和恢复速度快

innoDB引擎支持:热备、增量备份、完全备份

MyISAM引擎支持:温备、完全备份

  1. LVM-snapshot

这个备份工具在实际工作中几乎不使用,这个一个接近于热备的工具,利用LVM可以创建快照的特点备份数据,备份之前要先请求全局锁并且在创建完快照后释放全局锁,这个快照只能恢复一次,快照恢复后需要再次创建快照,使用cp、tar等工具进行物理备份,备份和恢复的速度较快

使用这个工具是很难实现增量备份的,并且请求全局锁需要等待一段时间,在实际工作的服务器上尤为如此,所以几乎不使用这个工具


因为LVM-snapshot几乎不使用,所以这里只做mysqldump和Xtrabackup的比较:

工具名称mysqldumpXtrabackup
备份方式逻辑备份物理备份
数据保存方式SQL脚本二进制文件
是否支持热备份支持支持
是否支持增量备份支持支持
备份过程是否锁表锁表不锁表
是否影响服务器的正常业务影响较大影响较小
备份和恢复的时间因为是单线程所以耗时较长耗时较短
占用空间占用空间小物理备份占用空间较大

推荐使用Xtrabackup进行完全备份,使用Mysqldump进行增量备份

二、Mysqldump工具

  • mysqldump是基于mysql的二进制日志备份的,是单线程备份,所以在备份、恢复大数据时,比较耗费时间,一般都使用mysqldump备份小数据

  • 使用mysqldump工具之前要记得开启

  • 使用Mysqldump工具:

-备份所有数据库

mysql> show databases;  #先查看有几个数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.07 sec)

mysql> use aaa;
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
mysql> show tables; #查看aaa库中的表
+---------------+
| Tables_in_aaa |
+---------------+
| aaa           |
| bbb           |
+---------------+
2 rows in set (0.00 sec)

mysql> exit
bye
[root@rzy ~]# mkdir /beifen #创建备份目录
[root@rzy ~]# mysqldump -u root -p123123 --opt --all-databases > /beifen/all.sql #备份所有数据库
mysqldump: [Warning] Using a password on the command line interface can be insecure.

-恢复数据

[root@rzy ~]# mysql -u root -p123123; #进入数据库
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \\g.
Your MySQL connection id is 4
Server version: 5.7.12-log Source distribution

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.

mysql> show databases; #先查看所有数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> drop database aaa; #删除aaa库
Query OK, 2 rows affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> exit
Bye
[root@rzy ~]# mysql -u root -p123123 < /beifen/all.sql  #使用刚才的完全备份恢复mysql数据
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@rzy ~]# mysql -u root -p123123 -e "show databases;" #-e命令可以直接调用SQl语句,查看所以数据库发现aaa库又回来了
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

-备份单个库

[root@rzy ~]# mysqldump -u root -p123123 --databases aaa > /beifen/aaa-data.sql #备份aaa库
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@rzy ~]# mysql -u root -p123123 -e "drop database aaa;" #删除aaa库
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@rzy ~]# mysql -u root -p123123 -e "show databases;;" #查看是否删除
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
[root@rzy ~]# mysql -u root -p123123 < /beifen/aaa-data.sql  #恢复aaa库
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@rzy ~]# mysql -u root -p123123 -e "show databases;;" #再次查看所有库,发现aaa库回来了
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

-备份单个、多个表

[root@rzy ~]# mysqldump -u root -p123123 aaa bbb > /beifen/aaa-bbb.sql #备份aaa库的bbb表
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@rzy ~]# mysql -u root -p123123 -e "use aaa; drop table bbb;" #删除aaa库的bbb表
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@rzy ~]# mysql -u root -p123123 -e "use aaa; show tables;" #查看是否删除
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+
| Tables_in_aaa |
+---------------+
| aaa           |
+---------------+
[root@rzy ~]# mysql -u root -p123123 aaa < /beifen/aaa-bbb.sql  #恢复bbb表,要注意指定库
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@rzy ~]# mysql -u root -p123123 -e "use aaa; show tables;" #查看是否恢复成功
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+
| Tables_in_aaa |
+---------------+
| aaa           |
| bbb           |
+---------------+
[root@rzy ~]# mysqldump -u root -p123123 aaa aaa bbb > /beifen/aaa-table.sql   #备份aaa库的aaa和bbb表
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@rzy ~]# mysql -u root -p123123 -e "use aaa; drop table aaa ;"         #删除aaa表
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@rzy ~]# mysql -u root -p123123 -e "use aaa; drop table bbb ;"         #删除bbb表
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@rzy ~]# mysql -u root -p123123 -e "use aaa; show tables;"       #查看aaa库的所有表确认删除
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@rzy ~]# mysql -u root -p123123 aaa < /beifen/aaa-table.sql      #恢复两个表
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@rzy ~]# mysql -u root -p123123 -e "use aaa; show tables;"       #查看aaa库的所有表,发现成功恢复
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+
| Tables_in_aaa |
+---------------+
| aaa           |
| bbb           |
+---------------+

-导出表的结构

[root@rzy ~]# mysqldump  -u root -p123123 -d aaa > /beifen/aaa-jiegou.sql #导出aaa库下所有表的结构
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@rzy ~]# mysqldump  -u root -p123123 -d aaa aaa > /beifen/aaa-jiegou.sql #只导出aaa库下aaa表的结构
mysqldump: [Warning] Using a password on the command line interface can be insecure.

-导出表的数据

[root@rzy ~]# mysqldump -u root -p123123 -t aaa > /beifen/aaa-shuju.sql #导出aaa库下所有表的数据
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@rzy ~]# mysqldump -u root -p123123 -t aaa aaa > /beifen/aaa-shuju.sql #只导出aaa库下aaa表的数据
mysqldump: [Warning] Using a password on the command line interface can be insecure.

三、Xtrabackup工具

(1)Xtrabackup概述

  • Xtrabackup是由percona公司开发、用于Mysql数据库物理备份的备份工具,支持Mysql、oracle、percona Server、mariaDB数据库,是一个开源的数据库备份工具

  • 使用Xtrabackup需要安装percona-toolkit-2.2.19-1.noarch.rpm和percona-xtrabackup-2.4.5-Linux-x86_64.tar.gz

  • 在Xtrabackup软件包安装完成后,在bin目录下,一共有六个文件:

[root@rzy ~]# cd /usr/src/percona-xtrabackup-2.4.5-Linux-x86_64/
[root@rzy percona-xtrabackup-2.4.5-Linux-x86_64]# ll
总用量 4
drwxr-xr-x  2 root root  111 11月 25 2016 bin
drwxr-xr-x  3 root root   18 11月 25 2016 man
drwxr-xr-x 14 root root 4096 11月 25 2016 percona-xtrabackup-2.4-test
[root@rzy percona-xtrabackup-2.4.5-Linux-x86_64]# cd bin/
[root@rzy bin]# ll
总用量 225988
lrwxrwxrwx 1 root root        10 11月 25 2016 innobackupex -> xtrabackup
-rwxr-xr-x 1 root root   5179300 11月 25 2016 xbcloud
-rwxr-xr-x 1 root root      3020 11月 25 2016 xbcloud_osenv
-rwxr-xr-x 1 root root   5001985 11月 25 2016 xbcrypt  #加解密使用
-rwxr-xr-x 1 root root   5071619 11月 25 2016 xbstream #类似于tar
-rwxr-xr-x 1 root root 216142648 11月 25 2016 xtrabackup  

其中最主要的是innobackupex和Xtrabackup,innobackupex是一个perl脚本,Xtrabackup是C\\C++编译的二进制

Xtrabackup是用来备份innoDB引擎的表的,不能备份非innoDB引擎的表,和mysqld server没有交互

可以看到innobackupex与Xtrabackup做了软连接,innobackupex脚本用来备份非innoDB引擎的表,但是可以调用Xtrabackup命令来备份innoDB引擎的表,还会发送命令与mysqld server进行交互,比如加读锁、获取位点等,简单的来说,innobackupex在Xtrabackup上做了一层封装,使之既能备份非innoDB表也可以调用Xtrabackup备份innoDB表

mysql的系统表使用的是MyISAM存储引擎,当我们备份系统表时一般都是通过innobackupex命令进行备份

(2)备份原理

  • Xtrabackup和innobackupex两个工具之间的交互和协调是通过文件的创建、删除来实现的,主要的文件有:
  1. Xtrabackup_suspended_1
  2. Xtrabackup_suspended_2
  3. Xtrabackup_log_copied
  • 交互的过程:
  1. innobackupex在启动Xtrabackup进程后,会一直等待Xtrabackup备份完innoDB文件。

    (而innobackupex如何知道Xtrabackup有没有备份完呢,其实在Xtrabackup备份完后会创建名叫Xtrabackup_suspended_2的文件,当innobackupex检测到这个文件被创建出来之后,就知道Xtrabackup已经备份完innoDB文件了)

  2. 在Xtrabackup备份完innoDB文件后,创建除了Xtrabackup_suspended_2文件,它会等待innobackupex把这个文件删除,才会继续往下执行操作

  3. innobackupex在检测到Xtrabackup_suspended_2被创建出来后就会继续往下执行操作

  4. innobackupex在备份完非innoDB表后,会删除Xtrabackup_suspended_2文件,接着等待Xtrabackup_log_copied创建

  5. Xtrabackup检测到Xtrabackup_suspended_2文件被删除后,会继续往下执行操作

(3)备份过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iJjABezQ-1625533842206)(F:\\个人文档\\markdown图片\\image-20210522110000697.png)]

(4)安装Xtrabackup

-实验环境

系统主机名mysql版本使用的软件包
centos7.4rzyMysql-5.7.12percona-toolkit-2.2.19-1.noarch.rpm percona-xtrabackup-2.4.5-Linux-x86_64.tar.gz

-实验步骤

[root@rzy ~]# ll #上传两个软件包
总用量 225988
-rw-------. 1 root root     1264 1?. 12 18:27 anaconda-ks.cfg
-rw-r--r--  1 root root 70389425 5?. 11 14:35 boost_1_59_0.tar.bz2
-rw-r--r--  1 root root 50571897 5?. 11 14:30 mysql-5.7.12.tar.gz
-rw-r--r--  1 root root  1736921 5?. 22 17:21 percona-toolkit-2.2.19-1.noarch.rpm
-rw-r--r--  1 root root 82404945 5?. 22 17:21 percona-xtrabackup-2.4.5-Linux-x86_64.tar.gz
[root@rzy ~]# tar xf percona-xtrabackup-2.4.5-Linux-x86_64.tar.gz -C /usr/src/
[root@rzy ~]# cd /usr/src/percona-xtrabackup-2.4.5-Linux-x86_64/
[root@rzy percona-xtrabackup-2.4.5-Linux-x86_64]# cp bin/* /usr/bin/ #优化命令执行路径,和修改环境变量是一样的
[root@rzy percona-xtrabackup-2.4.5-Linux-x86_64]# cd 
[root@rzy ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
       /dev/sr0 已经挂载到 /mnt 上
[root@rzy ~]# yum -y install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-TermReadKey.x86_64 perl-Digest-MD5 #安装依赖包
。。。。。。
完毕!
[root@rzy ~]# rpm -ivh percona-toolkit-2.2.19-1.noarch.rpm  #安装rpm包

-使用Xtrabackup工具

  • 常用选项:
选项作用
–host指定主机
–user指定用户名
–password指定密码
–port指定端口

以上是关于Mysql的备份的主要内容,如果未能解决你的问题,请参考以下文章

备份你自己的snipplr.com网站片段

部分代码片段

linux中怎么查看mysql数据库版本

Oracle数据库从RMAN备份集片段还原指定单个归档日志进行日志挖掘分析

如何用Java实现MySQL数据库的备份和恢复

mysql 自动备份脚本

(c)2006-2024 SYSTEM All Rights Reserved IT常识