对MyISAM引擎的表来说:如果当前此表在拷贝过程中没有任何写操作时,可以直接拷贝,对单张表拷贝时只需把把表相关的三个以.frm,.MYD,.MYI结尾的文件拷贝到另外的数据库实例对应的数据库目录下即可。
对InnoDB表来说:即使是innodb_file_per_table=on的情况下直接拷贝与表相关的两个文件到目标实例下不行,但可以通过拷贝整个数据目录到目标实例的数据目录下的方式来完成备份和恢复。
(1)通过mydump备份数据
备份的语句格式:mysqldump [options] db_name [tbl_name ...]
mysqldump [options] --databases db_name ...
mysqldump [options] --all-databases
options中选项:
--host=host_name(h host_name):指定要导出的目标数据库所在的主机,默认是localhost
--user=user_name(-u user_name):指定链接目标数据库的数据库用户名
--password[=password](-p[password]):指定链接目标数据库的数据库密码
--port=port_num(-P port_num):指定链接目标数据库的端口
--all-databases(-A):参数代表导出所有数据库里的所有的表
# 导出所有的数据库
]# mysqldump -uroot -p --all-databases > backup.sql
--databases(-B):参数代表导出指定的一个或多个数据库
# 导出一个数据库
]# mysqldump -uroot -p --databases course >course.sql
# 同时导出多个库
mysqldump -uroot -p --databases course test >mysqlbackup.sql
--add-drop-database:表示在使用--databases或者是--all-databases参数时在每个create database命令前都加上drop database的命令
--add-drop-table:表示在每个create table命令前加上drop table命令
--add-drop-trigger:表示在每个create trigger命令前加上drop trigger命令
--replace:表示使用replace命令插入数据而不是使用insert命令
--default-character-set=charset_name:指定默认的字符集,默认是UTF8
--set-charset:表示将SET NAMES default_character_set命令写入到导出备份文件中,默认是开启状态
--dump-slave[=value]:表示从复制的slave从库导出备份,且其中包含了change master to语句,则利用此备份文件可以直接建立另一个复制从库。value参数如果不写或者=1的情况下,则change master to语句写入到dump文件中,如果设置=2则代表也写入到dump文件中,只是会注释掉
# 从从库上备份
]# mysqldump -uroot -p --dump-slave --single-transaction course >course.sql
--master-data[=value]:表示从复制的主库上导出备份,和--dump-slave参数配置类似,可以利用此备份文件直接建立另一个复制从库。其value的取值含义也和dump-slave相同。使用该参数会自动打开—lock-all-table参数,除非同时使--single-transaction参数
# 从主库备份此备份方式会在备份开始之初在所有表上加一个只读锁(FLUSH TABLES WITH READ LOCK),当成功获取了该锁并开始备份之后,此锁就会立即释放。而后续的dump过程中不会影响其他的读写操作
]# mysqldump -uroot -p --master-data=2 --single-transaction course >course.sql
--tab=dir_name(-T dir_name):参数表示将备份文件以文本文件的方式生成,dir_name指定了存放的文件路径,每个表会生成两个文件,一个是.sql文件保存的表结构信息,一个是.txt文件保存的表数据信息,但是需要在my.cnf中先配置secure_file_priv=/usr/local/mysql/backup/参数。以文本的方式导出时还可以加入以下的参数
--fields-terminated-by=str参数指定每个字段值之间的间隔符,默认是tab
--fields-enclosed-by=char参数指定每个字段值使用什么字符括起来,默认是没有
--fields-optionally-enclosed-by=char参数指定对每个非数字类型的字段值使用什么 字符括起来,默认没有
--lines-terminated-by=str参数指定行之间的结束符,默认是newline
# 以文本方式导出数据库
]# mysqldump -uroot -p --tab=/tmp/ course
# 导出时指定分隔符等
]# mysqldump -uroot -p --tab=/tmp/ --fields-terminated-by="===" --fields-enclosed-by="\"" test
]# cat test_index01.txt
"4"==="DBMS stands for DataBase ..."===\N
"5"==="After you went through a ..."===\N
"6"==="In this tutorial we will show ..."===\N
--ignore-table=db_name.tbl_name:代表导出过程中忽略某个指定表的导出,如果要忽略多个表则这个参数要使用多次
# 导出course库中除了student_bak表外的所有表结构及数据
]# mysqldump -uroot -p --ignore-table course.student_bak course > nostubak_course.sql
--no-data(-d):参数代表不要导出数据,只导出表结构
# 仅导出表结构不导出数据
]# mysqldump -uroot -p --no-data course > nodata_course.sql
--no-create-info:仅导出数据不导出表结构
# 仅导出数据不导出表结构
]# mysqldump -uroot -p --no-create-info course > course.sql
--routines(-R):参数代表也要把存储过程和函数导出来
--triggers:参数代表也要将触发器导出来
# 导出course库中的存储过程和触发器
]# mysqldump -uroot -p --routines --triggers course >course_rt.sql
--where='where_condition'(-w ‘where_condition’):参数代表仅导出符合条件的数据
# 导出student表中sid小于5的数据
]# mysqldump -uroot -p --where="sid < 5" course student >course.student.sql
# 导出student表中sid为5或者6的数据
mysqldump -uroot -p --where="sid in (5,6)" course student >course.student.sql
--lock-all-tables(-x):参数代表在导出过程中对每个数据库的每个表加上一个只读锁
--no-autocommit:参数代表对每个表的数据导出内容用set autocommit=0和commit两个语句包围
--single-transaction:参数代表将事务隔离级别设置为可重复读并在导出开始时执行start transaction开启一个新的事务,在dump的执行过程中也不会阻止任何的读写操作
# 备份时开启一个新的事务
]# mysqldump -uroot -p --master-data --single-transaction course >course.sql
导出命令的其他用法:
# 导出course库中的一个表
]# mysqldump -uroot -p course student >course.student.sql
(2)FLUSH TABLES WITH READ LOCK
FLUSH TABLES WITH READ LOCK简称(FTWRL),该命令主要用于备份工具获取一致性备份(数据与binlog位点匹配)。由于FTWRL总共需要持有两把全局的MDL锁,并且还需要关闭所有表对象,因此这个命令的杀伤性很大,执行命令时容易导致库hang住。
FTWRL主要包括3个步骤分别是:上全局读锁(lock_global_read_lock),上全局读锁会导致所有更新操作都会被堵塞、清理表缓存(close_cached_tables)、上全局COMMIT锁(make_global_read_lock_block_commit) ,上全局COMMIT锁时,会堵塞活跃事务提交。
(3)记录导出的具体逻辑
打开在mysql的配置文件中配置gerenal_log的相关参数,可以记录导出过程的具体逻辑,配置如下:
# 修改配置文件记录导出过程的具体逻辑
general_log=on
# 记录的文件存放位置
general_log_file=/usr/local/mysql/data/general_log
(4)备份的导入
1)通过mysql命令导入
# 通过mysql命令导入
]# mysql -uroot -p
2)通过source命令导入
# 进入备份文件存放目录下
]# cd /data/mysql/backup
# 通过source命令导入备份
mysql> source test.sql;
3)文本文件的导入
对于文本文件的导入,分为两步,先要导入表结构,再导入文件,表结构文件的导入可以使用”mysql test < test.sql”或者source命令导入,数据文件的导入可以使用mysqlimport或者load data infile命令。
# 先导入表结构
]# mysql -uroot -p test
通过load data infile命令导入
# 登录mysql数据库,切换到test库,导入表结构
mysql> source test_index02.sql;
# 导入数据
mysql> load data infile "/tmp/test_index02.txt" into table test_index02 FIELDS TERMINATED BY "===" ENCLOSED BY "\"";
基于时间点的恢复是将数据库恢复到指定的时间点状态,通常是先通过全量恢复的方式先将数据库恢复到上一个全量恢复的时间点,然后再利用二进制日志恢复到指定的时间点。
(1)binglog日志的查看与执行
Mysqlbinlog工具可以用来解析二进制日志的内容,让日志可以被执行或者是查看
在数据库中重新执行某个二进制日志文件中的内容,可以使用如下命令:
# 执行binglog日志
]# mysqlbinlog /data/mysql/data/mysql-bin.000014 | mysql -uroot –p
]# mysqlbinlog /data/mysql/data/mysql-bin.000012 /data/mysql/data/mysql-bin.000013 | mysql -uroot –p
# 对binglog日志的导出也可先将日志识别导出到文件,在导入到数据库
]# mysqlbinlog /data/mysql/data/mysql-bin.000011 > testsql.sql
]# mysql -uroot -p
(2)根据时间段恢复数据
如果是恢复某个日志文件中的一部分内容,可以通过指定—start-datetime或者是—stop-datetime参数来确定开始恢复时间和停止恢复时间。
# 跳过某个时间段恢复数据
~]# mysqlbinlog --stop-datetime="2018-11-07 20:19:04" /data/mysql/data/mysql-bin.000013|mysql -uroot -p
~]# mysqlbinlog --start-datetime="2018-11-08 03:41:04" /data/mysql/data/mysql-bin.000013|mysql -uroot -p
(3)依据日志点恢复数据
基于binglog日志恢复数据时也可以通过设置--start-position和--stop-position两个参数指定开始位置和结束位置恢复数据。
# 从某个点开始恢复
]# mysqlbinlog --start-position=194 /data/mysql/data/mysql-bin.000014|mysql -uroot -p
(1)导出数据
select … into outfile命令可以用来导出表中符合条件的数据到文本文件,不会导出表结构,仅用来导出数据。
语句格式:select * from Table into outfile '/PATH/filename' fields terminated by ',' enclosed by '"' lines terminated by ‘\r\n'
各字段说明:
TERMINATED BY:用于指定字段值之间的符号
ENCLOSED BY:用来指定包裹文件中字符值的符号
ESCAPED BY:用来指定转义字符
# 将查询的数据导入到文本文件中
mysql> select * from test_index01 into outfile "/tmp/test01.txt" fields terminated by ',' enclosed by '"' lines terminated by '\r\n';
(2)导入数据
使用select … into outfile导出的文本文件,可以通过load data infile命令导入到表里,导入语句如下:
load data [low_priority] [local] infile 'file_name txt' [replace | ignore]
into table tbl_name
[fields
[terminated by't']
[OPTIONALLY] enclosed by '']
[escaped by'\' ]]
[lines terminated by'n']
[ignore number lines]
[(col_name, )]
各字段说明:
terminated by:指定分隔符
enclosed by:字段括起字符
escaped by:转义字符
terminated by:描述字段的分隔符,默认情况下是tab字符(\t)
enclosed by:描述的是字段的括起字符。
escaped by:描述的转义字符。默认的是反斜杠(backslash:\ )
lines:指定了每条记录的分隔符默认为'\n'即为换行符
local: 如果指定local关键词,则表明从客户主机读文件。如果local没指定,文件必须位于服务器上
replace和ignore关键词控制对现有的唯一键记录的重复的处理
# 导入备份的数据
mysql> load data infile '/tmp/test01.txt' into table test_index01 fields terminated by ',' enclosed by '"' lines terminated by '\r\n';
Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),Xtrabackup有两个主要的工具:xtrabackup、innobackupex,其中xtrabackup只能备份InnoDB和XtraDB两种数据表,innobackupex则封装了xtrabackup,同时可以备份MyISAM数据表。Xtrabackup做备份的时候不能备份表结构、触发器等。
(1)Xtrabackup的特点
1)备份过程快速、可靠;
2)备份过程不会打断正在执行的事务;
3)能够基于压缩等功能节约磁盘空间和流量;
4)自动实现备份检验;
5)还原速度快
(2)Xtrabackup的安装
Xtrabackup下载地址:https://www.percona.com/downloads/XtraBackup/LATEST/
Xtrabackup提供了多种安装方式,使用二进制包安装,只需将xtrabackup下载下来将二进制包拷贝至二进制文件目录”/usr/ bin”下即可。
# 下载二进制面编译安装包
]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.8/binary/tarball/percona-xtrabackup-2.4.8-Linux-x86_64.tar.gz
# 解压并将可执行文件拷贝至相应目录
]# tar -xf percona-xtrabackup-2.4.8-Linux-x86_64.tar.gz
]# cp percona-xtrabackup-2.4.8-Linux-x86_64/bin/* /usr/bin/
(3)使用Xtrabackup进行全量备份与恢复
全量备份:
# 备份所有的库
]# xtrabackup --backup --target-dir=/data/mysql/backup/ -uroot -pdayi123 -P 3306 --host=127.0.0.1
全量恢复:
恢复过程中首先要执行prepare,将所有的数据文件都准备到同一个时间点,因为在备份过程中所有的数据文件备份都是在不同的时间点,如果直接启动可能会导致冲突。
# 恢复前将所有数据准备到同一个时间点
]# xtrabackup --prepare --target-dir=/data/mysql/backup
# 恢复数据
]# xtrabackup --copy-back --target-dir=/data/mysql/ --datadir=/data/mysql/data/
# 确保回复后的数据的权限为mysql
]# chown mysql:mysql /data/mysql/data –R
# 回复后启动mysql
]# /etc/init.d/mysqld start
(4)使用Xtrabackup进行增量备份与恢复
增量备份:
# 先进行一次增量备份
]# xtrabackup --backup --target-dir=/data/mysql/backup/20181115_LVO/ -uroot -pdayi123 -P 3306 --host=127.0.0.1
# 基于全量备份的增量备份
]# xtrabackup --backup --target-dir=/data/mysql/backup/20181116_LV1/ --incremental-basedir=/data/mysql/backup/20181115_LVO/ -uroot -pdayi123 -P 3306 --host=127.0.0.1
# 基于上一次增量备份的增量备份
]# xtrabackup --backup --target-dir=/data/mysql/backup/20181117_LV2/ --incremental-basedir=/data/mysql/backup/20181116_LV1/ -uroot -pdayi123 -P 3306 --host=127.0.0.1
增量备份的恢复大体为3个步骤:恢复完全备份——>恢复增量备份到完全备份(开始恢复的增量备份要添加--redo-only参数,到最后一次增量备份去掉--redo-only参数)——>对整体的完全备份进行恢复,回滚那些未提交的数据。
# 恢复完全备份,并通过--redo-only参数应用xtrabackup日志中已提交的事务数据,不回滚还未提交的数据
]# xtrabackup --prepare --apply-log-only --target-dir=/data/mysql/backup/20181115_LVO/ --datadir=/data/mysql/data
]# xtrabackup --prepare --apply-log-only --target-dir=/data/mysql/backup/20181115_LVO/ --incremental-dir=/data/mysql/backup/20181116_LV1/ --datadir=/data/mysql/data
# 将两份增量备份引用到完全备份
]# xtrabackup --prepare --apply-log-only --target-dir=/data/mysql/backup/20181115_LVO/ --incremental-dir=/data/mysql/backup/20181117_LV2/ --datadir=/data/mysql/data
# 使用全备恢复数据
]# xtrabackup --copy-back --target-dir=/data/mysql/backup/20181115_LVO/ --datadir=/data/mysql/data
# 更改数据目录权限为mysql
]# chown mysql:mysql /data/mysql/data -R
(5)使用innobackupex进行全量备份与恢复
全量备份:
# 使用innobackupex进行全量备份
]# innobackupex --user=root --password=dayi123 --host=127.0.0.1 --port=3306 /data/mysql/back/
全量备份恢复:
# 生成ib_logfile文件
]# innobackupex --apply-log --user=root --password=dayi123 --host=127.0.0.1 /data/mysql/back/2018-11-09_04-43-50/
#还原数据到mysql的数据目录,确保在my.cnf中设置datadir
]# innobackupex --copy-back --user=root --password=dayi123 --host=127.0.0.1 /data/mysql/back/2018-11-09_04-43-50/
# 修改数据目录权限
]# chown mysql:mysql /data/mysql/data –R
# 启动mysql
]# /etc/init.d/mysqld start
(6)使用innobackupex进行增量备份与恢复
使用增量备份时,首先要有一个全量备份:
# 先进行一次全量备份
]# innobackupex --user=root --password=dayi123 --host=127.0.0.1 --port=3306 /data/mysql/back/
# 基于全量备份的增量备份
]# innobackupex --user=root --password=dayi123 --host=127.0.0.1 --incremental-basedir=/data/mysql/back/2018-11-09_05-30-52/ --incremental /data/mysql/back/
# 基于上次增量备份进行增量备份
]# innobackupex --user=root --password=dayi123 --host=127.0.0.1 --incremental-basedir=/data/mysql/back/2018-11-09_05-39-07/ --incremental /data/mysql/back/
增量备份的恢复:
# 准备基础的全量备份
]# innobackupex --apply-log --redo-only /data/mysql/back/2018-11-09_05-30-52/
# 准备增量备份1
]# innobackupex --apply-log --redo-only /data/mysql/back/2018-11-09_05-30-52/ --incremental-dir=/data/mysql/back/2018-11-09_05-39-07/
# 准备增量备份2,最后一个增量备份恢复不需要指定—redo-only
]# innobackupex --apply-log /data/mysql/back/2018-11-09_05-30-52/ --incremental-dir=/data/mysql/back/2018-11-09_05-40-55/
# 把所有的备份放在一起,准备全部备份来回滚暂停的事务
]# innobackupex --apply-log /data/mysql/back/2018-11-09_05-30-52/
# 恢复数据
]# innobackupex --copy-back --user=root --password=dayi123 --host=127.0.0.1 /data/mysql/back/2018-11-09_05-30-52/
# 修改mysql数据目录的权限并启动mysql
]# chown mysql:mysql /data/mysql/data –R
]# /etc/init.d/mysqld start