备份与恢复
备份
备份实质上就是保存数据副本。其中RAID1和RAID10保证的是硬件损坏而不会业务终止,而无法保证逻辑上的,如执行了drop table xxx,因此备份和RAID不冲突。
备份类型
- 根据备份时服务器是否在线:
- 热备份:读/写不受影响
- 温备份:仅可以执行读操作
- 冷备份:离线备份,读/写操作均中止
- 根据备份时数据格式:
- 物理备份:复制数据文件,速度快。
- 逻辑备份:将数据导出至文本文件中,速度慢。有可能丢失浮点数精度。但是他方便使用文本处理工具直接对齐处理,可移植性强。
- 根据备份时数据是否包含整个部分:
- 完全备份:备份全部数据。
- 增量备份:仅备份上次完全备份或增量备份以后变化的数据。
- 差异备份:仅备份上次完全备份以来变化的数据。
备份内容
数据
配置文件
二进制日志
事务日志
备份策略
完全+增量
完全+差异
建议:一个星期或者一个月做一次完全,然后一天做一次增量或差异。而逻辑方式还是物理方式看自己需要。
备份工具
mysql自带
mysqldump:逻辑备份工具,MyISAM(可实现温备份),InnoDB(可实现热备份)
mysqlhotcopy:物理备份工具,温备份
文件系统工具
cp:只能实现冷备份
lv:逻辑卷的快照功能,几乎热备。具体过程
几乎热备:LVM
使用snapshot:快照
前提:
1.数据文件要在逻辑卷
2.此逻辑卷所在卷组必须要有足够空间使用快照。
3.数据和事务日志文件必须放在同一逻辑卷上。
步骤如下:
1.打开会话,施加读锁,锁定所有表;否则会造成数据时间点不一致,你备份的和当时数据不一样
flush tables with read lock;
flush logs;//刷新二进制
2.通过另外一个终端,保存二进制日志文件及其相关位置信息
3.创建快照
lvcreate -L 容量大小 -s -p r -n LV_NAME /path/to/source_lv
例如:lvcreate -L 50M -s -p r -n name 卷信息
4.释放锁
unlock tables;
5.挂载快照卷,备份
mount
cp
6.删除快照卷
7.增量备份二进制日志
第三方商业工具
ibbackup
xtrabackup:开源工具
mysqldump
备份单个数据库或者库中特定表
mysqldump db_name tb1
其中的内容为批量的sql语句。恢复的话使用. +sql路径
注意:我们在备份的过程中,可能还有继续操作的事件,因此为了避免时间点的不同,我们需要进行加锁操作。具体如下:
1.打开会话,施加读锁,锁定所有表;否则会造成数据时间点不一致,你备份的和当时数据不一样
flush tables with read lock;
flush logs;//刷新二进制
2.通过另外一个终端,保存二进制日志文件及其相关位置信息
show binary logs;可以进行查看
3.执行备份
4.释放锁
unlock tables;
5.增量备份二进制日志
选项
- --master-data=n
- 0:表示不记录二进制日志及位置
- 1:以change master to的方式记录位置,可用于恢复后直接启动从服务器
- 2:以change master to的方式记录位置,但默认被注释掉
- --lock-all-tables
锁定所有表,这样我们不需要手动的加锁。如MyISAM进行温备份 - --flush-logs
执行二进制日志滚动 - --single-transaction
如果指定库中的表类型均为innodb,可使用--single-transaction启动热备。不要和--lock-all-tables一起使用。设置事务的隔离级别为可重复读,即REPEATABLE READ,这样能保证在一个事务中所有相同的查询读取到同样的数据,也就大概保证了在dump期间,如果其他innodb引擎的线程修改了表的数据并提交,对该dump线程的数据并无影响,在这期间不会锁表。
备份多个库
选项
- --all-databases:备份所有库
- --databases DB_NAME1,DB_NAME2...:备份指定库
备份与恢复(每周完全备份+每日增量备份)
完全备份:mysqldump
增量备份:备份二进制日志文件(在备份之前先进行flush logs滚动二进制)
第一步:进行完全备份
D:\SoftWare\MySQL\MySQL Server 5.5\bin>mysqldump.exe -uroot -p --lock-all-table--flush-logs --master-data=2 --all-databases > db_all.sqlEnter password: *********
第二步:连上mysql进行一些操作
完全备份:mysqldump
增量备份:备份二进制日志文件(在备份之前先进行flush logs滚动二进制)
第一步:进行完全备份
D:\SoftWare\MySQL\MySQL Server 5.5\bin>mysqldump.exe -uroot -p --lock-all-table--flush-logs --master-data=2 --all-databases > db_all.sqlEnter password: *********
第二步:连上mysql进行一些操作
- 删除备份所在的二进制之前的日志文件
删除binlog.000010之前的
mysql> purge binary logs to 'binlog.000010';Query OK, 0 rows affected (0.20 sec)
不过最好进行备份一下,别直接删除。
- 修改一部分数据,如删除
第三步:增量备份
- 滚动二进制日式
flush logs;
- 进到我们的目录下,手动备份
- 第一种是直接拷贝这个文件
- 第二种是使用mysqlbinlog进行重定向(推荐)
mysqlbinlog binlog.000011 > xxx.sql
第四步:模拟删掉数据库,注意千万别删二进制文件
- 删掉库之后,mysql是无法进行启动,此时我们需要对其进行初始化
scripts/mysql_install_db --user=mysql --datadir=xxxx
- 启动mysql
- 还原操作
- 先还原完全备份
mysql -uroot -p - 还原增量备份
mysql < xxx.sql
注意
- 对于逻辑备份恢复过程中,因为涉及到数据库修改,因此也会生成二进制日志,但是这个是没必要的,因此我们需要把他现关掉。
set sql_log_bin=0;//关掉的是会话的。
2. 针对InnoDB。就算FLUSH TABLES WITH READ LOCK;由于事务日志运行原理,后台会定期的将事务日志同步到数据文件中,因此我们备份时候需要等待全部同步完成方可进行备份。使用命令show engine innodb status\G来查看innodb引擎状态
使用select into outfile
备份:mysql>select * into outfile 'path/to/xxx.txt' from tb_name [where cluase],他保存的是文本文件,而不是sql语句
恢复:mysql>load data infile 'path/to/xxx.txt' into table tb_name;
使用逻辑卷LVM
使用LVM通过快照方式,来完成几乎热备功能。
前提
- 数据文件要在逻辑卷上
- 此逻辑卷所在卷组必须要有足够空间使用快照卷
- 事务日志要和数据文件在一个逻辑卷上,无论如何二进制日志肯定是要分开存放的
步骤
- 打开会话,施加读锁,锁定所有表
mysql> flush tables with read lock;
flush logs; - 通过另外一个终端,保存二进制文件及其相关位置
$mysql -uroot -p -e 'show master status\G' > /path/to/date+%F
.txt - 创建快照卷
lvcreate -L 大小 -s -p r -n LV_NAME /path/to/source_lv - 释放锁
unlock tables; - 挂载快照卷、备份
mount
cp命令 - 删除快照卷
- 增量备份二进制日志
xtrabackup
介绍
Xtrabackup是由percona开源的免费数据库热备份软件,它能对InnoDB数据库和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份同样需要加表锁),同时支持流,压缩和增量MySQL备份
mysqldump备份方式是采用的逻辑备份,其最大的缺陷是备份和恢复速度较慢,如果数据库大于50G,mysqldump备份就不太适合。
安装
可以去官网下载最新版本包。以rpm包安装为例.
#安装[root@xiaxuefei mysql5.8]# yum install -y percona-xtrabackup-80-8.0.5-1.el7.x86_64.rpm#查看安装包[root@xiaxuefei mysql5.8]# rpm -ql percona-xtrabackup-80/usr/bin/xbcloud //备份至云/usr/bin/xbcloud_osenv/usr/bin/xbcrypt //用来加密或解密备份的数据/usr/bin/xbstream //用来解压或压缩xbstream格式的压缩文件/usr/bin/xtrabackup //一个由C编译而来的二进制文件/usr/lib64/xtrabackup/plugin/keyring_file.so/usr/lib64/xtrabackup/plugin/keyring_vault.so/usr/share/doc/percona-xtrabackup-80-8.0.5/usr/share/doc/percona-xtrabackup-80-8.0.5/LICENSE/usr/share/man/man1/xbcrypt.1.gz/usr/share/man/man1/xbstream.1.gz/usr/share/man/man1/xtrabackup.1.gz
注意:innobackupex 功能全部集成到 xtrabackup 里面,只有一个 binary,另外为了使用上的兼容考虑,innobackupex作为 xtrabackup 的一个软链,即xtrabackup现在支持非Innodb表备份,并且Innobackupex在下一版本中移除,建议通过xtrabackup替换innobackupex。
特点
- 在不暂停数据库的情况下创建热的InnoDB备份
- 进行MySQL的增量备份
- 将压缩的MySQL备份传输到另一台服务器
- 在MySQL服务器之间移动表格
- 轻松创建新的MySQL复制从站
- 在不增加服务器负载的情况下备份MySQL
参数
-u, --user=name-p, --password[=name]-P, --port=#-H, --host=name-S, --socket=name--apply-log-only:prepare备份的时候只执行redo阶段,用于增量备份。跳过未提交事务的回滚,因为备份时未提交的事务可能正在进行,并且很可能会在下一次增量备份中提交。--backup:创建备份并且放入--target-dir目录中--close-files:不保持文件打开状态,xtrabackup打开表空间的时候通常不会关闭文件句柄,目的是为了正确处理DDL操作。如果表空间数量非常巨大并且不适合任何限制,一旦文件不在被访问的时候这个选项可以关闭文件句柄.打开这个选项会产生不一致的备份。--compact:创建一份没有辅助索引的紧凑备份--compress:压缩所有输出数据,包括事务日志文件和元数据文件,通过指定的压缩算法,目前唯一支持的算法是quicklz.结果文件是qpress归档格式,每个xtrabackup创建的*.qp文件都可以通过qpress程序提取或者解压缩--compress-chunk-size=#:压缩线程工作buffer的字节大小,默认是64K--compress-threads=#:xtrabackup进行并行数据压缩时的worker线程的数量,该选项默认值是1,并行压缩('compress-threads')可以和并行文件拷贝('parallel')一起使用。例如:'--parallel=4 --compress --compress-threads=2'会创建4个IO线程读取数据并通过管道传送给2个压缩线程。--create-ib-logfile:这个选项目前还没有实现,目前创建Innodb事务日志,你还是需要prepare两次。--datadir=DIRECTORY:backup的源目录,mysql实例的数据目录。从my.cnf中读取,或者命令行指定。--defaults-extra-file=[MY.CNF]:在global files文件之后读取,必须在命令行的第一选项位置指定。--defaults-file=[MY.CNF]:唯一从给定文件读取默认选项,必须是个真实文件,必须在命令行第一个选项位置指定。--defaults-group=GROUP-NAME:从配置文件读取的组,innobakcupex多个实例部署时使用。--export:为导出的表创建必要的文件--extra-lsndir=DIRECTORY:(for --backup):在指定目录创建一份xtrabakcup_checkpoints文件的额外的备份。--incremental-basedir=DIRECTORY:创建一份增量备份时,这个目录是增量别分的一份包含了full bakcup的Base数据集。--incremental-dir=DIRECTORY:prepare增量备份的时候,增量备份在DIRECTORY结合full backup创建出一份新的full backup。--incremental-force-scan:创建一份增量备份时,强制扫描所有增在备份中的数据页即使完全改变的page bitmap数据可用。--incremetal-lsn=LSN:创建增量备份的时候指定lsn。--innodb-log-arch-dir:指定包含归档日志的目录。只能和xtrabackup --prepare选项一起使用。--innodb-miscellaneous:从My.cnf文件读取的一组Innodb选项。以便xtrabackup以同样的配置启动内置的Innodb。通常不需要显示指定。--log-copy-interval=#:这个选项指定了log拷贝线程check的时间间隔(默认1秒)。--log-stream:xtrabakcup不拷贝数据文件,将事务日志内容重定向到标准输出直到--suspend-at-end文件被删除。这个选项自动开启--suspend-at-end。--no-defaults:不从任何选项文件中读取任何默认选项,必须在命令行第一个选项。--databases=#:指定了需要备份的数据库和表。--database-file=#:指定包含数据库和表的文件格式为databasename1.tablename1为一个元素,一个元素一行。--parallel=#:指定备份时拷贝多个数据文件并发的进程数,默认值为1。--prepare:xtrabackup在一份通过--backup生成的备份执行还原操作,以便准备使用。--print-default:打印程序参数列表并退出,必须放在命令行首位。--print-param:使xtrabackup打印参数用来将数据文件拷贝到datadir并还原它们。--rebuild_indexes:在apply事务日志之后重建innodb辅助索引,只有和--prepare一起才生效。--rebuild_threads=#:在紧凑备份重建辅助索引的线程数,只有和--prepare和rebuild-index一起才生效。--stats:xtrabakcup扫描指定数据文件并打印出索引统计。--stream=name:将所有备份文件以指定格式流向标准输出,目前支持的格式有xbstream和tar。--suspend-at-end:使xtrabackup在--target-dir目录中生成xtrabakcup_suspended文件。在拷贝数据文件之后xtrabackup不是退出而是继续拷贝日志文件并且等待知道xtrabakcup_suspended文件被删除。这项可以使xtrabackup和其他程序协同工作。--tables=name:正则表达式匹配database.tablename。备份匹配的表。--tables-file=name:指定文件,一个表名一行。--target-dir=DIRECTORY:指定backup的目的地,如果目录不存在,xtrabakcup会创建。如果目录存在且为空则成功。不会覆盖已存在的文件。--throttle=#:指定每秒操作读写对的数量。--tmpdir=name:当使用--print-param指定的时候打印出正确的tmpdir参数。--to-archived-lsn=LSN:指定prepare备份时apply事务日志的LSN,只能和xtarbackup --prepare选项一起用。--user-memory = #:通过--prepare prepare备份时候分配多大内存,目的像innodb_buffer_pool_size。默认值100M如果你有足够大的内存。1-2G是推荐值,支持各种单位(1MB,1M,1GB,1G)。--version:打印xtrabackup版本并退出。--xbstream:支持同时压缩和流式化。需要客服传统归档tar,cpio和其他不允许动态streaming生成的文件的限制,例如动态压缩文件,xbstream超越其他传统流式/归档格式的的优点是,并发stream多个文件并且更紧凑的数据存储(所以可以和--parallel选项选项一起使用xbstream格式进行streaming)
备份
完全备份
- 备份用户权限创建
这一步非必须,我们也可以利用管理员身份进行创建。如果要使用一个最小权限的用户进行备份,则可基于如下命令创建此类用户:
mysql> create user 'bakuser'@'localhost' identified by '!X2iaxuefei';Query OK, 0 rows affected (0.20 sec)mysql> grant reload,lock tables, PROCESS, replication client on *.* to 'bakuser'@'localhost';Query OK, 0 rows affected (0.03 sec)mysql> flush PRIVILEGES;Query OK, 0 rows affected (0.02 sec)
2. 创建备份
[root@xiaxuefei ~]# xtrabackup --backup --target-dir=/root/workspace/mysql5.8/data这里我们以root身份来进行或者[root@xiaxuefei ~]# xtrabackup --user='bakuser' --password='!X2iaxuefei' --backup --target-dir=/root/workspace/mysql5.8/data
备份的结果:
[root@xiaxuefei data]# lltotal 57388//备份的配置文件-rw-r-----. 1 root root 476 Mar 16 16:22 backup-my.cnf//备份这一刻的二进制日志 文件-rw-r-----. 1 root root 155 Mar 16 16:22 binlog.000003/***[root@xiaxuefei data]# file binlog.000003*binlog.000003: MySQL replication log**/-rw-r-----. 1 root root 16 Mar 16 16:22 binlog.index-rw-r-----. 1 root root 3531 Mar 16 16:22 ib_buffer_pool-rw-r-----. 1 root root 12582912 Mar 16 16:22 ibdata1drwxr-x---. 2 root root 143 Mar 16 16:22 mysql-rw-r-----. 1 root root 25165824 Mar 16 16:22 mysql.ibddrwxr-x---. 2 root root 4096 Mar 16 16:22 performance_schemadrwxr-x---. 2 root root 28 Mar 16 16:22 sys-rw-r-----. 1 root root 10485760 Mar 16 16:22 undo_001-rw-r-----. 1 root root 10485760 Mar 16 16:22 undo_002-rw-r-----. 1 root root 18 Mar 16 16:22 xtrabackup_binlog_info-rw-r-----. 1 root root 79 Mar 16 16:22 xtrabackup_checkpoints-rw-r-----. 1 root root 460 Mar 16 16:22 xtrabackup_info//这个是数据文件,可以使用file来查看-rw-r-----. 1 root root 2560 Mar 16 16:22 xtrabackup_logfile-rw-r-----. 1 root root 248 Mar 16 16:22 xtrabackup_tablespaces
- xtrabackup_checkpoints
文件包括备份类型(增量备份或完全备份)、备份状态(如是否已经为prepare状态)和LSN(日志序列号)范围信息
使用cat打开:
[root@xiaxuefei data]# cat xtrabackup_checkpoints backup_type = full-backuped //完全备份 from_lsn = 0 to_lsn = 19061577 last_lsn = 19061577
- xtrabackup_binlog_info
mysq服务器当前正在使用的二进制日志文件及至备份这一刻位置二进制事件的位置
[root@xiaxuefei data]# cat xtrabackup_binlog_infobinlog.000003 155
- xtrabackup_info
备份命令用到的配置选项信息
[root@xiaxuefei data]# cat xtrabackup_infouuid = 97db1a12-47c4-11e9-9527-000c29aff0e9name = tool_name = xtrabackuptool_command = --backup --target-dir=/root/workspace/mysql5.8/datatool_version = 8.0.5ibbackup_version = 8.0.5server_version = 8.0.15start_time = 2019-03-16 16:22:06end_time = 2019-03-16 16:22:09lock_time = 0binlog_pos = filename 'binlog.000003', position '155'innodb_from_lsn = 0innodb_to_lsn = 19061577partial = Nincremental = Nformat = filecompressed = Nencrypted = N
3. 将配置文件上传至需要备份远程机器
[root@xiaxuefei mysql5.8]# scp -r data/ root@192.168.147.133:/root/workspace/mysql5.8/data
当然也可以使用xtrabackup自带的两个参数
--copy-back:将备份的数据拷贝到DATADIR
--move-back:将备份的数据移动到DATADIR
4. 准备(prepare)工作
一般情况下,在备份完成后,数据尚不能用于恢复操作,因为备份的数据可能会包含尚未提交的事务或已经提交但尚未同步至数据文件的事务。因此,此时数据文件仍处于不一致状态。
“prepare”主要作用是通过回滚尚未提交的事务及同步已经提交的事务至数据文件中,使得数据文件处于一致性状态.
[root@xiaxuefei data]# xtrabackup --prepare --target-dir='/root/workspace/mysql5.8/data'当然在这里的话,我们在远程的机器即192.168.147.133
5. 恢复
- 关闭数据库
[root@xiaxuefei data]# systemctl stop mysqld - 删除数据目录
- 将该数据同步到mysql的目录下
- 可以查看my.cnf配置中mysql的数据目录
- rsync -avrP /root/workspace/mysql5.8/data /var/lib/mysql/
- 更改属主属组
chown -R mysql:mysql /var/lib/mysql。否则/var/run/mysqld/的属主和属组还是root,mysql并不能在其中创建文件。可以根据提示进行查看
- 启动mysql
[root@xiaxuefei data]# systemctl start mysqld - 查看新机器上的数据库
mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || performance_schema || sys || testdb |+--------------------+5 rows in set (0.02 sec)哈哈,恢复成功。
6.恢复二进制日志
如果我们后来又进行的一些操作,通过flush logs滚动二进制来进行记录,并将这些二进制发送至目标机器。
[root@xiaxuefei mysql]# scp binlog.000001 root@192.168.147.133:/root/workspace/mysql5.8/data
- 导出二进制文件为sql语句
[root@xiaxuefei data]# mysqlbinlog binlog.000001 > new.sql
- 连上mysql进行恢复
mysql> source /root/workspace/mysql5.8/data/new.sql
增量备份
- 创建完全备份
不在演示,见上 - 创建第一次增量备份
[root@xiaxuefei mysql]# xtrabackup --backup --target-dir=/root/workspace/mysql5.8/incr/incr1 --incremental-basedir=/root/workspace/mysql5.8/data
- 创建第二次增量备份
这里需要特别注意,--incremental-basedir应该指向谁呢??如果不清楚,请看一下增量备份的概念。
[root@linux-node1 backup]# xtrabackup --backup --target-dir=/root/workspace/mysql5.8/incr/incr2 --incremental-basedir=/root/workspace/mysql5.8/incr/incr1
--incremental-basedir指向的是最近的上一次增量或者完全备份(因为第一次还没有增量备份)
- 推送备份到目标机器
scp -r incr1/ root@192.168.147.133:/root/workspace/mysql5.8/data
- 准备备份
- 准备(prepare)工作
见上,不过需要添加--apply-log-only参数。否在在进行增量备份应用时会报错
[root@xiaxuefei incr1]# xtrabackup --prepare --apply-log-only --target-dir=/root/workspace/mysql5.8/data/data --incremental-dir=/root/workspace/mysql5.8/data/incr1xtrabackup: recognized server arguments: --innodb_checksum_algorithm=innodb --innodb_log_checksums=1 --innodb_data_file_path=ibdata1:12M:autoextend --innodb_log_files_in_group=2 --innodb_log_file_size=50331648 --innodb_page_size=16384 --innodb_undo_directory=./ --innodb_undo_tablespaces=2 --server-id=0 --innodb_log_checksums=ON --innodb_redo_log_encrypt=0 --innodb_undo_log_encrypt=0 xtrabackup: recognized client arguments: --prepare=1 --apply-log-only=1 --target-dir=/root/workspace/mysql5.8/data/data --incremental-dir=/root/workspace/mysql5.8/data/incr1 xtrabackup version 8.0.5 based on MySQL server 8.0.14 Linux (x86_64) (revision id: 40ec8a3)incremental backup from 19110584 is enabled.xtrabackup: cd to /root/workspace/mysql5.8/data/data/xtrabackup: This target seems to be already prepared.---------------------------------看这里xtrabackup: error: applying incremental backup needs target prepared with --apply-log-only.
[root@xiaxuefei incr1]# xtrabackup --prepare --apply-log-only --target-dir=/root/workspace/mysql5.8/data/data
- 将第一次增量备份应用到完全备份
[root@xiaxuefei incr1]# xtrabackup --prepare --apply-log-only --target-dir=/root/workspace/mysql5.8/data/data --incremental-dir=/root/workspace/mysql5.8/data/incr1
- 将第二次增量备份应用到完全备份
[root@xiaxuefei incr1]# xtrabackup --prepare --target-dir=/root/workspace/mysql5.8/data/data --incremental-dir=/root/workspace/mysql5.8/data/incr1
注意:在合并除最后一个之外的所有增量时应该使用xtrabackup –apply-log-only。这就是为什么上一行不包含该选项。即使 在最后一步使用了,备份仍然是一致的,但在这种情况下,服务器将执行回滚阶段。
6.恢复数据
同上
- 说明
- 增量备份仅用于InnoDB或者XtraDB表,对于MyISAM而言,执行增量备份其实进行的是完全备份。
- InnoDB 每个 page 有个 LSN 号,LSN 是全局递增的,page 被更改时会记录当前的 LSN 号,page中的 LSN 越大,说明当前page越新(最近被更新)。每次备份会记录当前备份到的LSN(xtrabackup_checkpoints 文件中),增量备份就是只拷贝LSN大于上次备份的page,比上次备份小的跳过,每个 ibd 文件最终备份出来的是增量 delta 文件
压缩备份
- 创建压缩备份
使用xtrabackup --compress
选项
[root@xiaxuefei compress]# xtrabackup --backup --compress --target-dir=/root/workspace/mysql5.8/compress
- 并行压缩备份
通过xtrabackup --compress-threads
来进行并行压缩
[root@xiaxuefei compress]# xtrabackup --backup --compress --compress-threads=n(如4) --target-dir=/root/workspace/mysql5.8/compress
3. 解压数据
[root@xiaxuefei compress]# xtrabackup --decompress --target-dir=/root/workspace/mysql5.8/compress
注意:需要确保安装qpress
4. 清除原始压缩文件
[root@xiaxuefei compress]# xtrabackup --remove-original --target-dir=/root/workspace/mysql5.8/compress
5. 拷贝至目标机器
剩下步骤见完全备份
导出或者导入单张表
默认情况下,InnoDB表不能通过直接复制表文件的方式在mysql服务器之间进行移植,即便使用了innodb_file_per_table选项,而使用xtrabackup工具可以实现此种功能。此时需要“导出”表的mysql服务器启用了innodb_file_per_table选项,并且“导入表”的服务器同时启用innodb_file_per_table和innodb_expand_impoer 选项。
导出表
导出表是在完全备份的prepare阶段进行的。因此,一旦完全备份完成,就可以在prepare过程中通过--export选项某表导出。
完全备份[root@xiaxuefei export_impoer]# xtrabackup --backup --target-dir=/root/workspace/mysql5.8/export_impoer导出表xtrabackup --prepare --export --target-dir='/root/workspace/mysql5.8/export_impoer'
此命令回味每个innodb表的表空间创建一个以.exp结尾的文件,这些以.exp结尾的文件则可以用于导入至其他服务器
导入表
要在mysql服务器上导入来自其他服务器的某innodb表,需要先在当前服务器上创建一个跟原表一样结构的表,然后才能实现表的导入。
- 创建表
mysql> create table mytable(...) ENGINE=InnoDB;
- 将此表的表空间删除
mysql> alter table mytable.mytable discard tablespace;
- 将来自导出表的服务器的mytable表的mytable.ibd和mytable.exp文件复制到当前服务器目录,进行导入
mysql> alter table mytable.mytable import tablespace;