一、备份策略赘述

1、备份的类型

  • 类型1:

    • 热备份:读写不受影响(MyISAM不支持热备,InnoDB支持热备)
    • 温备份:仅可以执行读操作
    • 冷备份:离线备份,读写操作均中止
  • 类型2:
    • 物理备份:复制数据文件进行备份,占用较多的空间,速度快
    • 逻辑备份:将数据导出至文本文件中,占用空间少,速度慢,可能丢失精度
  • 类型3:
    • 完全备份:备份全部数据
    • 增量备份:仅备份上次完全备份或增量备份以后变化的数据,备份较快,还原复杂
    • 差异备份:仅备份上次完全备份以来变化的数据,备份较慢,还原简单

2、备份需要考虑的因素

  • 温备的持锁多久,在锁状态的情况下无法写入数据
  • 备份产生的负载,要调空闲的时间备份
  • 备份过程的时长,数据量大的时候时间会很长,要选择合适的方案
  • 恢复过程的时长,备份数据需要即时测试

3、备份的目标

  • 数据库数据,每个表空间单独存放
  • 二进制日志,需要和数据分开存储
  • InnoDB的事务日志
  • 存储过程、存储函数、触发器或事件调度器等
  • 服务器的配置文件:/etc/my.cnf

4、备份工具

  • mysqldump工具:逻辑备份工具,适用所有存储引擎温备;支持完全或部分备份;对InnoDB存储引擎支持热备;Schema(数据库的定义)和数据存储在一起。
用法:
shell> mysqldump [options] db_name [tbl_name ...]
shell> mysqldump [options] --databases db_name ...
shell> mysqldump [options] --all-databases
选项:
-A:备份所有库
-B db_name1,[db_name2,...]:备份指定库
-E:备份相关的所有event scheduler
-R:备份所有存储过程和存储函数
--triggers:备份表相关触发器,默认启用,用--skip-triggers,不备份触发器
--master-data={1|2}:
1:所备份的数据之前加一条记录为CHANGE MASTER TO语句,非注释,不指定默认为1
2:记录为注释的CHANGE MASTER TO语句,注意:此选项会自动关闭--lock-tables功能,自动打开--lock-all-tables功能(除非开启--single-transaction)
-F:备份前滚动日志,锁定表完成后,执行flush logs命令,生成新的二进制日志文件,配合-A时,会导致刷新多次数据库,在同一时刻执行转储和日志刷新,则应同时使用--flush-logs和-x,--master-data或-single-transaction,此时只刷新一次;建议:和-x,--master-data或 --single-transaction一起使用
--compact 去掉注释,适合调试,生产不使用
-d:只备份表结构
-t:只备份数据,不备份create table
-n:不备份create database,可被-A或-B覆盖
--flush-privileges:备份前刷新授权表,备份mysql库或相关时需要使用
-f:忽略SQL错误,继续执行
--hex-blob:使用十六进制符号转储二进制列(例如,“abc”变为0x616263),受影响的数据类型包括BINARY, VARBINARY,BLOB,BIT
-q:不缓存查询,直接输出,加快备份速度

MyISAM备份选项:支持温备;不支持热备,所以必须先锁定要备份的库,而后启动备份操作

-x,--lock-all-tables:加全局读锁,锁定所有库的所有表,同时加--single-transaction或--lock-tables选项会关闭此选项功能,注意:数据量大时,可能会导致长时间无法并发访问数据库

-l,--lock-tables:对于需要备份的每个数据库,在启动备份之前分别锁定其所有表,默认为on,--skip-lock-tables选项可禁用,对备份MyISAM的多个库,可能会造成数据不一致

InnoDB备份选项:支持热备,可用温备但不建议用

--single-transaction:此选项Innodb中推荐使用,不适用MyISAM,此选项会开始备份前,先执

行START TRANSACTION指令开启事务此选项通过在单个事务中转储所有表来创建一致的快照。仅适用于存储在支持多版本控制的存储引擎中的表(目前只有InnoDB可以); 转储不保证与其他存储引擎保持一致。

​ 在进行单事务转储时,要确保有效的转储文件(正确的表内容和二进制日志位置),需要保证没有其他连接使用以下语句:ALTER TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLE

​ 此选项和 --lock-tables(此选项隐含提交挂起的事务)选项是相互排斥备份大型表时,建议将--single-transaction选项和--quick结合一起使用

InnoDB建议备份策略:
mysqldump –uroot –A –F –E –R --single-transaction --master-data=1 --flush-privileges --triggers --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql MyISAM建议备份策略:
mysqldump –uroot –A –F –E –R –x --master-data=1 --flush-privileges --triggers --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql
  • xtrabackup工具:由Percona提供支持对InnoDB做热备(物理备份)的工具,支持完全备份、增量备份

由Percona公司提供的mysql数据库备份工具,开源的能够对innodb和xtradb数据库进行热备的工具;

xtrabackup 是用来备份 InnoDB 表的,不能备份非 InnoDB 表;

innobackupex 脚本用来备份非 InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,还会和 MySQL Server 发送命令进行交互,如加全局读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)等。即innobackupex是在xtrabackup 之上做了一层封装实现的;

虽然目前一般不用 MyISAM 表,只是 MySQL 库下的系统表是 MyISAM 的,因此备份基本都通过 innobackupex 命令进行;

xtrabackup版本升级到2.4后,相比之前的2.1有了比较大的变化:innobackupex 功能全部集成到 xtrabackup 里面,只有一个 binary程序,另外为了兼容考虑,innobackupex作为 xtrabackup 的软链接,即xtrabackup现在支持非Innodb表备份,并且Innobackupex在下一版本中移除,建议通过xtrabackup替换innobackupex。

参考手册:https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html

使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命名的目录中,在备份时,innobackupex还会在备份目录中创建如下文件:

1)xtrabackup_checkpoints:备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息,每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的;

2)xtrabackup_binlog_info:MySQL服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置;

3)xtrabackup_info:innobackupex工具执行时的相关信息;

4)backup-my.cnf:备份命令用到的配置选项信息;

5)xtrabackup_logfile:备份生成的日志文件。

用法:
innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/
选项:
--user:该选项表示备份账号
--password:该选项表示备份的密码
--host:该选项表示备份数据库的地址
--databases:该选项接受的参数为数据名,如果要指定多个数据库,彼此间需要以空格隔开;如:"xtra_test dba_test",同时,在指定某数据库时,也可以只指定其中的某张表。如:"mydatabase.mytable"。该选项对innodb引擎表无效,还是会备份所有innodb表
--defaults-file:该选项指定从哪个文件读取MySQL配置,必须放在命令行第一个选项位置
--incremental:该选项表示创建一个增量备份,需要指定--incremental-basedir
--incremental-basedir:该选项指定为前一次全备份或增量备份的目录,与--incremental同时使用
--incremental-dir:该选项表示还原时增量备份的目录
--include=name:指定表名,格式:databasename.tablename
--apply-log:一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。此选项作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态
--use-memory:该选项表示和--apply-log选项一起使用,prepare 备份的时候,xtrabackup做crash recovery分配的内存大小,单位字节。也可(1MB,1M,1G,1GB),推荐1G
--export:表示开启可导出单独的表之后再导入其他Mysql中
--redo-only:此选项在prepare base full backup,往其中merge增量备份时候使用
--copy-back:做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir
--move-back:这个选项与--copy-back相似,唯一的区别是它不拷贝文件,而是移动文件到目的地。这个选项移除backup文件,用时候必须小心。使用场景:没有足够的磁盘空间同事保留数据文件和Backup副本

注意:

1)datadir目录必须为空。除非指定innobackupex --force-non-empty-directorires选项指定,否则--copy-backup选项不会覆盖;

2)在restore之前,必须shutdown MySQL实例,不能将一个运行中的实例restore到datadir目录中;

3)由于文件属性会被保留,大部分情况下需要在启动实例之前将文件的属主改为mysql,chown -R mysql:mysql /data/mysqldb

  • mysqlbackup工具:热备份,MySQL Enterprise Edition组件
  • mysqlhotcopy工具:几乎冷备,仅适用于MyISAM存储引擎
  • 基于lvm快照备份:几乎热备,需要在拍快照前锁表
  • tar + cp 等归档复制工具备份:完全冷备

三、备份方案

1、cp + tar == 物理冷备

将数据目录打包压缩备份,需要停服务,不推荐

​ 1)备份:

~]# mkdir /backup
~]# systemctl stop mariadb #停止服务
~]# tar Jcf /backup/mariadb_all.tar.xz /var/lib/mysql/ #打包压缩
backup]# systemctl start mariadb

​ 2)还原:

~]# systemctl stop mariadb
~]# rm /var/lib/mysql/ -rf #将损坏的库删除
~]# cd /backup/
backup]# tar xf mariadb_all.tar.xz #解压打包的数据库文件
backup]# cp -av var/lib/mysql/ /var/lib/ #还原
backup]# systemctl start mariadb #启动服务,恢复成功

2、lvm快照 + binlog == 几乎物理热备 + 增量备份

​ 1)备份:需要将数据库目录存放到lvm逻辑卷上

准备lvm环境:
~]# pvcreate /dev/sda5
~]# vgcreate vg0 /dev/sda5
~]# lvcreate -n lv_data -L 10G vg0
~]# lvcreate -n lv_binlog -L 10G vg0
~]# mkfs.xfs /dev/vg0/lv_data
~]# mkfs.xfs /dev/vg0/lv_binlog
~]# mkdir -pv /data/{mysqldb,binlog} #创建数据目录和二进制日志存放目录
~]# chown -R mysql:mysql /data/
~]# vim /etc/fstab
UUID=4e3d726a-d420-4c1e-812b-da315012ba86 /data/mysqldb xfs defaults 0 0
UUID=6dd98866-769f-4369-8738-291fbcc94ca1 /data/binlog xfs defaults 0 0
配置数据库,模拟生成大量数据:
~]# yum install mariadb-server -y
~]# vim /etc/my.cnf
[mysqld]
datadir = /data/mysqldb #指定数据库存放路径
log_bin = /data/binlog/mariadb-bin #开启二进制日志记录,并且存放到指定路径
innodb_file_per_table = ON #开启每个表单独的表空间
~]# systemctl start mariadb
~]# mysql #连接数据库,这里省略了用户名和密码,以下都是如此
MariaDB [(none)]> CREATE DATABASE school; #创建一个测试的库
MariaDB [(none)]> use school
MariaDB [school]> CREATE TABLE testtb (id int auto_increment primary key,name char(30),age int default 20); #创建一张数据表
MariaDB [school]> DELIMITER // #修改语句结束符为“//”
MariaDB [school]> CREATE PROCEDURE pro_testtb() #写一个存储过程,目的是生成十万条记录测试用
-> BEGIN
-> declare i int;
-> set i = 1;
-> while i < 100000
-> do INSERT INTO testtb(name,age) VALUES (CONCAT('testuser',i),i);
-> SET i = i + 1;
-> END while;
-> END//
MariaDB [school]> DELIMITER ; #记得将语句结束符再改回来
MariaDB [school]> CALL pro_testtb; #调用存储过程来
MariaDB [school]> SELECT COUNT(*) FROM testtb; #查看一下表中有十万条记录
+----------+
| COUNT(*) |
+----------+
| 99999 |
+----------+
开始备份:
MariaDB [school]> FLUSH TABLES WITH READ LOCK; #备份前切记锁表,防止用户继续写入
MariaDB [school]> FLUSH LOGS; #滚动一下二进制日志
MariaDB [school]> SHOW MASTER LOGS; #查看二进制日志的位置
+--------------------+-----------+
| Log_name | File_size |
+--------------------+-----------+
| mariadb-bin.000001 | 30334 |
| mariadb-bin.000002 | 1038814 |
| mariadb-bin.000003 | 29178309 |
| mariadb-bin.000004 | 528 |
| mariadb-bin.000005 | 245 | #将此出记录下来,我们后边需要用到
+--------------------+-----------+
~]# lvcreate -L 5G -n lv_mysql_snap -s -p r /dev/vg0/lv_data #需要再开一个终端创建快照,不要退出mysql终端
MariaDB [school]> UNLOCK TABLES; #创建快照后第一时间解锁,小心用户投诉
~]# mount -o nouuid,norecovery /dev/vg0/lv_mysql_snap /mnt/ #将快照挂载到/mnt
~]# cp -av /mnt/ /backup #拷贝数据到备份目录
~]# umount /mnt/
~]# lvremove /dev/vg0/lv_mysql_snap #拷贝完成后即时删除快照,影响服务器性能,到此完全备份完成~
再加点数据:
MariaDB [school]> CALL pro_testtb; #让我们模拟再来插入十万条数据
MariaDB [school]> SELECT COUNT(*) FROM testtb;
+----------+
| COUNT(*) |
+----------+
| 199998 | #现在是二十万条记录数据了
+----------+

​ 2)还原:

模拟数据库损坏:
~]# rm -rf /data/mysqldb/* #服务器崩溃,不多BB,直接清空库
~]# systemctl stop mariadb #停服务
开始还原:
~]# cp -av /backup/* /data/mysqldb/ #将备份的文件cp到对应的库目录下
在/etc/my.cnf的[mysqld]下加上skip_networking,禁止用户使用数据库,防止恢复过程中的数据写入
~]# systemctl start mariadb #启动服务
~]# ls -1 /data/binlog/ #查看二进制日记的文件个数
mariadb-bin.000001
mariadb-bin.000002
mariadb-bin.000003
mariadb-bin.000004
mariadb-bin.000005
mariadb-bin.000006
mariadb-bin.index
~]# mysqlbinlog --start-position=245 /data/binlog/mariadb-bin.000005 > binlog.sql #到出完全备份时间点以后的数据
~]# mysqlbinlog /data/binlog/mariadb-bin.000006 >> binlog.sql #将之后的所有数据都追加到同一sql文件中
~]# mysql < binlog.sql #利用二进制日志从我们之前完全备份的点开始增量还原
~]# mysql -e 'SELECT COUNT(*) FROM school.testtb' #查看一下,二十万条记录都在,nice
+----------+
| COUNT(*) |
+----------+
| 199998 |
+----------+
到/etc/my.cnf的[mysqld]下删除skip_networking,重启服务,到此还原完成~

3、mysqldump + InnoDB + binlog= 完全逻辑热备 + 增量备份

​ 1)备份:这里我就不再生成数据了,就接着上边的环境做了

~]# mysqldump -A -F -E -R --single-transaction --master-data=2 --flush-privileges  > /backup/full-`date +%F-%T`.sql  #全库完全备份

​ 2)模拟故障:

MariaDB [(none)]> CREATE DATABASE db1;  #创建一个库
MariaDB [(none)]> CREATE DATABASE db2; #再创建一个库
MariaDB [school]> use school;
MariaDB [school]> DROP TABLE testtb; #误操作,将我们二十万条记录的表删掉了
MariaDB [school]> CREATE TABLE students (id INT(4) AUTO_INCREMENT PRIMARY KEY,name CHAR(30),age TINYINT); #后续又有用户创建了其他的表
MariaDB [school]> INSERT INTO students(name,age) VALUES ('user1',20); #并且还加入了数据

​ 3)还原:

此时,我们发现了有一个表不见了,需要紧急恢复,开始吧
MariaDB [(none)]> FLUSH TABLES WITH READ LOCK; #锁表
MariaDB [(none)]> FLUSH LOGS; #刷新滚动一次二进制日志文件
MariaDB [(none)]> SHOW MASTER LOGS; #查看当前的日志状态
+--------------------+-----------+
| Log_name | File_size |
+--------------------+-----------+
| mariadb-bin.000001 | 30334 |
| mariadb-bin.000002 | 1038814 |
| mariadb-bin.000003 | 29178309 |
| mariadb-bin.000004 | 528 |
| mariadb-bin.000005 | 29177760 |
| mariadb-bin.000006 | 29177786 |
| mariadb-bin.000007 | 953 |
| mariadb-bin.000008 | 245 |
+--------------------+-----------+
~]# systemctl stop mariadb #停止服务,准备修复
~]# head -30 /backup/full-2018-06-14-05\:33\:47.sql |grep "CHANGE MASTER"
-- CHANGE MASTER TO MASTER_LOG_FILE='mariadb-bin.000007', MASTER_LOG_POS=245; #找到完全备份的日志点,在mariadb-bin.000007的245
~]# ls -1 /data/binlog/
mariadb-bin.000001
mariadb-bin.000002
mariadb-bin.000003
mariadb-bin.000004
mariadb-bin.000005
mariadb-bin.000006
mariadb-bin.000007
mariadb-bin.000008
mariadb-bin.index
~]# mysqlbinlog --start-position=245 /data/binlog/mariadb-bin.000007 > /backup/binlog.sql #将完全备份之后的二进制日志导出来
~]# mysqlbinlog /data/binlog/mariadb-bin.000008 >> /backup/binlog.sql
~]# vim /backup/binlog.sql #修改导出的sql文件,把误操作的SQL语句删除
删除"DROP TABLE `testtb` /* generated by server */"这行
导入备份:
~]# rm -rf /data/mysqldb/* #先清空故障库
~]# vim /etc/my.cnf #编辑配置文件
在[mysqld]加入skip_networking,防止用户写入数据
~]# systemctl start mariadb #启动服务
~]# mysql < /backup/full-2018-06-14-05\:33\:47.sql #导入完全备份
~]# mysql < /backup/binlog.sql #导入增量备份
MariaDB [(none)]> show databases; #查看一下我们的数据是否成功恢复
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 | #已恢复
| db2 | #已恢复
| mysql |
| performance_schema |
| school |
| test |
+--------------------+
MariaDB [(none)]> SELECT COUNT(*) FROM school.testtb;
+----------+
| COUNT(*) |
+----------+
| 199999 | #已恢复
+----------+
MariaDB [(none)]> SELECT * FROM school.students;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | user1 | 20 | #已恢复
+----+-------+------+
到现在为止,已经完成恢复,把配置文件中的skip_networking删除,重启服务,大功告成~

4、Xtrabackup + InnoDB == 完全热备 + 增量备份

​ 1)完全备份

~]# innobackupex --user=root /backup/  #这里省略了密码

​ 2)增删数据

MariaDB [school]> CALL pro_testtb;  #增加一些数据
MariaDB [school]> SELECT COUNT(*) FROM testtb; #现在有三十万条记录了
+----------+
| COUNT(*) |
+----------+
| 299998 |
+----------+
MariaDB [school]> INSERT INTO students VALUES (2,'user2',21);
MariaDB [school]> UPDATE students SET age=19 WHERE id=1;
MariaDB [school]> SELECT * FROM students;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | user1 | 19 |
| 2 | user2 | 21 |
+----+-------+------+

​ 3)增量备份

~]# mkdir /backup/inc{1,2}  #创建增量备份的目录
~]# innobackupex --incremental /backup/inc1/ --incremental-basedir=/backup/2018-06-14_10-44-57/ #指定在完全备份的基础上增量备份

​ 4)增删数据

MariaDB [(none)]> CREATE DATABASE db3;
MariaDB [(none)]> DROP TABLE school.students; #误操作删除了表
MariaDB [(none)]> use school
MariaDB [school]> CALL pro_testtb; #后续又有数据产生
MariaDB [school]> SELECT COUNT(*) FROM testtb;
+----------+
| COUNT(*) |
+----------+
| 399997 |
+----------+
MariaDB [school]> SELECT * FROM students; #到此出发现students表不见了,怎么办?
ERROR 1146 (42S02): Table 'school.students' doesn't exist

​ 5)故障出现

~]# rm -rf /data/mysqldb/*  #还原前清空数据目录
MariaDB [(none)]> show databases; #此时数据库已经没了
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+

​ 6)紧急还原

恢复完全备份和增量备份:
~]# systemctl stop mariadb #停止服务
~]# innobackupex --apply-log --redo-only /backup/2018-06-14_10-44-57/ #整理完全备份的数据,因为需要保留没有做完的事务日志所以一定要记得加"--redo-only"选项
~]# innobackupex --apply-log --redo-only /backup/2018-06-14_10-44-57/ --incremental-dir=/backup/inc1/2018-06-14_10-52-05/ #在完全备份的基础上将增量备份导入到一块,这里是最新的增量备份,"--redo-only"选项可以不加,加上也可以,为了误操作我就都加了
~]# ls /data/mysqldb/ #确认一下数据库目录是否为空
~]# innobackupex --copy-back /backup/2018-06-14_10-44-57/ #导入备份数据
~]# chown -R mysql:mysql /data/mysqldb/ #记得修改数据的所属组和所属者
~]# vim my.cnf 加入skip_networking,防止此时用户操作数据
~]# systemctl start mariadb #启动服务,此时已经恢复到了最新的备份时的状态了
依靠二进制日志,恢复最新增量备份到now的数据:
~]# cat /backup/2018-06-14_10-44-57/xtrabackup_binlog_info #查看一下备份时的二进制日志记录点
mariadb-bin.000011 35740416
~]# ls -1 /data/binlog/ #看看我们的二进制日志文件记录到哪里了
mariadb-bin.000001
mariadb-bin.000002
mariadb-bin.000003
mariadb-bin.000004
mariadb-bin.000005
mariadb-bin.000006
mariadb-bin.000007
mariadb-bin.000008
mariadb-bin.000009
mariadb-bin.000010
mariadb-bin.000011
mariadb-bin.000012
mariadb-bin.000013
mariadb-bin.index
~]# mysqlbinlog --start-position=35740416 /data/binlog/mariadb-bin.000011 > /backup/binlog.sql #将最新增量备份之后的二进制日志记录的数据导出来
~]# mysqlbinlog /data/binlog/mariadb-bin.000012 >> /backup/binlog.sql
~]# mysqlbinlog /data/binlog/mariadb-bin.000013 >> /backup/binlog.sql
编辑 /backup/binlog.sql 文件,将 "DROP TABLE `school`.`students` /* generated by server */" 删除,撤销误删除操作
MariaDB [(none)]> SET sql_log_bin=0; #先临时关闭二进制日记记录功能
MariaDB [(none)]> source /backup/binlog.sql #导入增量备份之后的最新数据
查看确认一下数据有没有恢复完整,把my.cnf中的skip_networking删除,重启服务
到此已经恢复到了最新的状态~

5、使用Xtrabackup实现单表备份

​ 1)备份单表

~]# innobackupex --include="testdb.testlog" /backup  #备份表数据
~]# mysql -e 'SHOW CREATE TABLE testdb.testlog' > /backup/desc_testdb_testlog.sql #备份表空间
~]# mysql -e 'DROP TABLE testdb.testlog' #模拟故障,删除testlog表

​ 2)还原单表

~]# innobackupex --apply-log --export /backup/2018-06-14_17-47-02/  #整理表数据
~]# vim /backup/desc_testdb_testlog.sql #编辑创建表空间的语句,删除以下字段
Table Create Table
testlog
~]# mysql testdb < /backup/desc_testdb_testlog.sql #导入表空间
~]# mysql testdb -e 'DESC testlog' #查看是否导入成功
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(30) | YES | | NULL | |
| age | int(11) | YES | | 20 | |
+-------+----------+------+-----+---------+----------------+
~]# mysql -e 'ALTER TABLE testdb.testlog DISCARD TABLESPACE' #清除表空间
~]# cd /backup/2018-06-14_17-47-02/testdb/
testdb]# cp testlog.cfg testlog.exp testlog.ibd /var/lib/mysql/testdb/ #将表数据复制到库目录
~]# chown -R mysql:mysql /var/lib/mysql/testdb/ #修改所属者和所属组
~]# mysql -e 'ALTER TABLE testdb.testlog IMPORT TABLESPACE' #导入表空间

备份与恢复:MySQL系列之十二的更多相关文章

  1. Mysql系列(十二)—— 索引下推优化

    索引条件下推(ICP)是对MySQL使用索引从表中检索行的情况的优化.如果没有ICP,存储引擎会遍历索引以查找基表中的行,并将它们返回给MySQL服务器,该服务器会评估WHERE行的条件.启用ICP后 ...

  2. CRL快速开发框架系列教程十二(MongoDB支持)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  3. 屌炸天实战 MySQL 系列教程(二) 史上最屌、你不知道的数据库操作

    此篇写MySQL中最基础,也是最重要的操作! 第一篇:屌炸天实战 MySQL 系列教程(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:屌炸天实战 MySQL 系列教程(二) 史上最屌.你不 ...

  4. webpack4 系列教程(十二):处理第三方JavaScript库

    教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<webpack4 系列教程(十二):处理第三方 JavaScript 库>原文地址.或者来我的小站看更多内容:godbm ...

  5. OSGi 系列(十二)之 Http Service

    OSGi 系列(十二)之 Http Service 1. 原始的 HttpService (1) 新建 web-osgi 工程,目录结构如下: (2) HomeServlet package com. ...

  6. Java 设计模式系列(十二)策略模式(Strategy)

    Java 设计模式系列(十二)策略模式(Strategy) 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以 ...

  7. hbase源码系列(十二)Get、Scan在服务端是如何处理

    hbase源码系列(十二)Get.Scan在服务端是如何处理?   继上一篇讲了Put和Delete之后,这一篇我们讲Get和Scan, 因为我发现这两个操作几乎是一样的过程,就像之前的Put和Del ...

  8. Dubbo学习系列之十二(Quartz任务调度)

    Quartz词义为"石英"水晶,然后聪明的人类利用它发明了石英手表,因石英晶体在受到电流影响时,它会产生规律的振动,于是,这种时间上的规律,也被应用到了软件界,来命名了一款任务调度 ...

  9. SQL注入之Sqli-labs系列第十二关

    开始挑战第十二关(Error Based- Double quotes- String) 12点半了,不困,继续,继续,继续 先看看页面,通常的使用单引号等进行操作,看看啥么情况先 咦,出现错误信息了 ...

随机推荐

  1. 基于DirectShow和FFmpeg的USB摄像头监控软件-转

    第一个版本 ### 软件版本及实现功能 0.0.1 1. USB摄像头枚举和设备信息获取2. 实时视频观看3. 24小时不间断录像,录像文件支持暴风影音播放 ### 软件说明: 软件基于 Direct ...

  2. 欧拉函数(汇总&例题)

    定义 欧拉函数 $\varphi(n)$表示小于等于$n$的正整数中与$n$互质的数的数目. 性质 1.积性函数(证明). 2.$\varphi(1)=1$(显然) 3.对于质数$n$,$\varph ...

  3. ACM学习历程—Hihocoder [Offer收割]编程练习赛1

    比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...

  4. Asp.net工作流workflow实战(一)

    最近开发一个项目用到了工作流引擎,之前研究过微软的workflow所有就用它了,距离上次用有一段时间了,好多东西有点模糊了,就在此处一遍写代码一遍回忆. 首先,在我的项目中新建了.netframwor ...

  5. NB-IoT知识

    通常,我们把物联网设备分为三类: ①无需移动性,大数据量(上行),需较宽频段,比如城市监控摄像头. ②移动性强,需执行频繁切换,小数据量,比如车队追踪管理. ③无需移动性,小数据量,对时延不敏感,比如 ...

  6. linux->windows主动推送文件同步目录数据 linux-windows数据目录同步

    1 .windows下安装openssh for windows工具,下载地址 https://www.mls-software.com/opensshd.html 2.修改openssh安装目录下e ...

  7. JavaScript原型模式(prototype)

    1.原型是一个对象,其他对象可以通过它实现属性的继承所有对象在默认的情况下都有一个原型,因为原型的本身也是对象,所以一个类的真正原型是被类的内部[prototype]属性所指出.每个函数都有一个属性叫 ...

  8. mac tree 命令

    mac下默认是没有 tree命令的,不过我们可以使用find命令模拟出tree命令的效果,如显示当前目录的 tree 的命令: find . -print | sed -e 's;[^/]*/;|__ ...

  9. #ifdef-#endif的作用及其使用技巧

    电脑程序语句,我们可以用它区隔一些与特定头文件.程序库和其他文件版本有关的代码. 1 2 3 #ifdef语句1 //程序2 #endif 可翻译为:如果宏定义了语句1则程序2. 作用:我们可以用它区 ...

  10. 汉字转为unicode

    在word中输入“立项申请阶段”,将光标移到每字之后时按下组合键Alt+X. 立项申请阶段 7ACB  9879  7533  8BF7  9636  6BB5 \u7ACB\u9879\u7533\ ...