MySQL数据库维护管理与备份实战

一、MySQL版本

1、MySQL官方发行版

MySQL是最流行的数据库,主要特点:

简单:MySQL使用很简单,任何稍微有IT背景的技术人员都可以无师自通地参照文档安装运行和使用MySQL,这几乎没有什么门槛。

开源:开源意味着流行和免费。

支持多种存储引擎:MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。

支持高可用架构:MySQL自身提供的replication(主从复制)功能可以实现MySQL数据的实时备份。

2、Mysql存储引擎

Mysql最常用的有两个存储引擎:MyISAM和 InnoDB

MySQL4和5使用默认的MyISAM存储引擎。从MYSQL5.5开始,MySQL已将默认存储引擎从MyISAM更改为InnoDB。

两种存储引擎的大致区别表现在:

1)InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中出错还可以回滚还原,而MyISAM就不可以了。

2)MyISAM查询数据相对较快,适合大量的select ,可以全文索引,InnoDB适合频繁修改以及涉及到安全性较高的应用。

3)InnoDB支持外键,支持行级锁,MyISAM不支持。

扫描二维码关注公众号,回复: 14515715 查看本文章

4) MyISAM索引和数据是分开的,而且其索引是压缩的,缓存在内存的是索引,不是数据。而InnoDB缓存在内存的是数据,相对来说,服务器内存越大,InnoDB发挥的优势越大。 

5) InnoDB可支持大并发请求,适合大量insert、update操作。

关于MyISAM与InnoDB选择使用:

1)如果应用程序一定要使用事务,毫无疑问要选择INNODB引擎。

2)如果应用程序对查询性能要求较高,就要使用MYISAM了。MYISAM拥有全文索引的功能,这可以极大地优化查询的效率。

3、Percona  Server分支

Percona Server由领先的MySQL咨询公司Percona发布。

Percona Server是一款独立的数据库产品,其可以完全与MySQL兼容,可以在不更改代码的情况了下将存储引擎更换成XtraDB。是最接近官方MySQL Enterprise发行版的版本。

Percona提供了高性能XtraDB引擎,还提供PXC高可用解决方案,并且附带了percona-toolkit等DBA管理工具箱。

4、MariaDB

MariaDB由MySQL的创始人开发,MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。

MariaDB提供了MySQL提供的标准存储引擎,即MyISAM和InnoDB,10.0.9版起使用XtraDB(名称代号为Aria)来代替MySQL的InnoDB。

5、如何选择

综合多年使用经验和性能对比,线上业务系统首选Percona分支,其次是MYSQL版本,最后是MariaDB。

二、MySQL常用管理命令

1、连接Mysql  (客户端工具NaviCat、phpMyAdmin、MySQL-Front)

格式:

mysql -h  主机地址 -u用户名 -p用户密码

1)连接到本机上的MYSQL。

首先进入Mysql安装程序的bin目录下,再键入命令:

./mysql -u root -p

回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密码前必须没有空格,否则让你重新输入密码。

2)连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123,则键入以下命令:

mysql -h110.110.110.110 -u root -p123;(注:u与root之间可以不用加空格)

3)退出MYSQL命令:

exit (回车)

2、修改密码

格式:

mysqladmin -u用户名 -p旧密码 password 新密码

1)首先在Mysql安装目录下面的bin目录,然后键入以下命令:

mysqladmin -u root  -p旧密码 password ab12

注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。

2)再将root的密码改为abc345:

mysqladmin -u root -p ab12 password abc345

3、增加新用户/授权用户

注意:和上面不同,下面的因为是MYSQL命令行中的命令,所以后面都带一个分号作为命令结束符。

格式:

grant select on 数据库.* to 用户名@登录主机 identified by “密码”

1)增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用root用户连入MYSQL,然后键入以下命令:

mysql>grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";

但这种权限增加的用户是十分危险的,如某个人知道test1的密码,那么他就可以在internet上的任何一台电脑上登录这台mysql数据库,并可对数据进行任意操作,解决办法是设置登录权限。

2)增加一个用户test2密码为abc,让它只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作(localhost指本地主机,即MYSQL数据库所在的那台主机),这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库。

mysql>grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc";

如果你不想test2有密码,可以再执行下面这个命令将密码取消掉。

mysql>grant select,insert,update,delete on mydb.* to test2@localhost identified by "";

如果想给一个用户test2授予访问mydb数据库的所有权限,并且仅允许test2在192.168.11.121这个客户端ip登录访问,可执行如下命令:

mysql>grant all on mydb.* to [email protected] identified by "abc";

4、数据库基础操作

1)创建数据库

注意:创建数据库之前要先连接Mysql服务器。

命令:

create  database  <数据库名>

创建数据库,并分配用户方法:

CREATE DATABASE 数据库名;
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER ON 数据库名.* TO 数据库名@localhost IDENTIFIED BY '密码';

例1:建立一个名为abc的数据库

mysql> create database abc;

2)显示数据库

命令:

show databases (注意:最后有个s)
mysql> show databases;

3)删除数据库

命令:

drop database <数据库名>

例如:删除名为 iivey的数据库

mysql> drop database iivey;
mysql> drop database if exists drop_database;    //if exists 判断数据库是否存在,不存在也不产生错误
Query OK, 0 rows affected (0.00 sec)

4)连接数据库

命令:

use <数据库名>

例如:如果iivey数据库存在,尝试存取它:

mysql> use iivey;

use语句可以通告MySQL把iivey数据库作为默认(当前)数据库使用,用于后续语句。该数据库保持为默认数据库,直到语段的结尾,或者直到发布一个不同的USE语句。

5、Mysql表操作

1)创建数据表

命令:

create table <表名> ( <字段名1> <类型1> [,..<字段名n> <类型n>]);
mysql> create table MyClass(
> id int(4) not null primary key auto_increment,
> name char(20) not null,
> sex int(4) not null default '0',
> degree double(16,2));

2)删除数据表

命令:

drop table <表名>

例如:删除表名为 MyClass 的表

mysql> drop table MyClass;

3)表插入数据

命令:

insert into <表名> [( <字段名1>[,..<字段名n > ])] values ( 值1 )[, ( 值n )]

例如:在表MyClass中插入二条记录, 这二条记录表示:编号为1的名为Tom的成绩为90.45, 编号为2 的名为Joan 的成绩为88.99, 编号为3的名为Wang的成绩为99.5。

mysql> insert into MyClass values(1,'Tom',90.45),(2,'Joan',88.99), (3,'Wang', 99.5);

4)查询表中的数据

1. 查询所有行

命令:

select <字段1,字段2,...> from < 表名 > where < 表达式 >

例如:查看表 MyClass 中所有数据

mysql> select * from MyClass;

2. 查询前几行数据

例如:查看表 MyClass 中前2行数据

mysql> select * from MyClass order by id limit 0,2;

5)删除表中数据

命令:

delete from 表名 where 表达式

例如:删除表 MyClass中编号为1的记录

mysql> delete from MyClass where id=1;

6)修改表中数据

语法:

update 表名 set 字段=新值,… where 条件
mysql> update MyClass set name='Mary' where id=1;

7)增加字段

命令:

alter table 表名 add 字段  类型 其他;

例如:在表MyClass中添加了一个字段passtest,类型为int(4),默认值为0.

mysql> alter table MyClass add passtest int(4) default '0'

8)修改表名

命令:

rename table 原表名 to 新表名;

例如:在表MyClass名字更改为YouClass

mysql> rename table MyClass to YouClass;

三、MySQL两个重要日志文件

1)错误日志 ,当mysql启动有问题的时候,我们需要借助这个日志进行排查。

2)慢日志 ,当业务出现慢或者超时的时候,我们需要观查mysql的慢日志是否过多。

mysql的错误日志:

删除掉数据,无法启动mysql,观察错误日志:

log-error=/data/mysql/mysqld.log

观察mysql错误日志:

tail -f /data/mysql/mysqld.log

重启观察日志。

mysql慢日志说明:

slow_query_log=on
long_query_time=1
slow_query_log_file=/data/mysql/mysql-slow.log

测试数据的添加:

use test;
CREATE TABLE IF NOT EXISTS `shijiange`(
   `id` INT UNSIGNED,
   `username` VARCHAR(50) NOT NULL,
   `password` VARCHAR(100) NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into shijiange values (1, 'shijiange', 'mypwd');
insert into shijiange values (6, 'shijiange6', 'mypwd6');
insert into shijiange (`username`, password) select username, password from shijiange;

mysql慢日志说明:

# Time: 180809 21:12:05
# User@Host: root[root] @ localhost []  Id:     1
# Query_time: 1.386900  Lock_time: 0.000114 Rows_sent: 0  Rows_examined: 655360
SET timestamp=1533820325;
insert into shijiange (`username`, password) select username, password from shijiange;

四、mysqldump备份数据库

1)导出整个数据库

导出文件默认是存在:

mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysqldump -u user_name -p123456 database_name > outfile_name.sql

2)导出一个表

mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
mysqldump -u user_name -p database_name table_name > outfile_name.sql

3)导出一个数据库结构

mysqldump -u user_name -p -d  --add-drop-table database_name > outfile_name.sql

含义:-d 没有数据 --add-drop-table 在每个create语句之前增加一个drop table。

4)带语言参数导出

mysqldump -uroot -p –default-character-set=latin1 --set-charset=gbk --skip-opt database_name > outfile_name.sql

案例:

1. cmd导出sql文件

C:\Program Files (x86)\MySQL\MySQL Server 5.5\bin

mysqldump -uroot -proot prodatashow pr_pip_run --where=" check_date >= '2019-01-01 00:00:00.0'" > C:\Users\Administrator\Desktop\exportData\Temp.sql

mysqldump -uroot -proot prodatashow pr_rush_repair --where=" check_date >= '2019-01-01 00:00:00.0'" > C:\Users\Administrator\Desktop\exportData\Temp.sql

2. 导入sql文件

首先启动mysql数据库。

cmd 下输入:

net start mysql

然进入mysql的安装的bin目录下:

mysql -hlocalhost -uroot -p

登录myslq。

然后输入:

use prodatashow

后面为数据库的名称。

最后把要导入的sql文件根据本地导入:

source 本地目录

source /mydata/data.sql;

3. 导入csv文件

首先要选中要导入的表。

通过Navicat客户端进入数据库,点击pr_pip_run表,右击然后选择导入向导:

选择.csv文件: 

选择要导入的文件,编码utf-8,之后点击下一步:

直接按照默认的跳过,下一步: 

时间分隔符,默认下一步: 

选择要导入的表pr_pip_run,点击下一步: 

选择栏位,手动对应的往下依次排就行了,然后默认下一步:

要把字段和字段相应的内容一一对应(参照下面的pr_pipe_run数据库中的内容),只需要按照已经排好的顺序依次往下选择即可,这样导入的时候才知道往哪个字段导入csv哪个对应的数据。

下面是测试表的:

选额新增,默认下一步: 

点击开始: 

出现successful后关闭即可。 

之后选中表点击刷新: 

数据已经全部导入了。 

五、Xtrabackup工具备份数据库

1、Xtrabackup 简介

Xtrabackup是由percona提供的mysql数据库备份工具,Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份,不会锁表 。

Xtrabackup中主要包含两个工具:

xtrabackup:是用于热备份innodb、 xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;

innobackupex:是将xtrabackup进行封装的perl脚本,可以备份和恢复MyISAM表以及数据表结构。

Percona XtraBackup 2.4.11之后innobackupex与xtrabackup软连,故后期版本命令中移除了innbackupex。

#增量备份其实只针对的是InnoDB,对于MyISAM来说,还是完整备份。

Xtrabackup与mysqldump区别:

Xtrabackup属于物理备份,mysqldump属于逻辑备份。

物理备份缺点:跨平台性差(跨文件系统可能不能恢复),备份时间长,冗余备份,浪费存储空间。

mysqldump备份缺点:效率较低,备份和还原速度慢,锁表,且备份过程中,数据插入和更新操作被阻塞。

Xtrabackup占用的CPU与内存较少,消耗的IO相对较大,备份后的文件较大。

通过mysql自带的工具mysqldump进行逻辑备份和恢复,虽然可以节省磁盘空间,但是速度很慢。

2、安装xtrabackup工具包

1. 几个percona官方yum源
Do、wnload Percona Release

Percona Repo

2. 下载yum源

Download Percona Release

3. 安装yum源

[root@localhost app]# rpm -ivh percona-release-0.1-4.noarch.rpm

4. 测试安装库

[root@localhost app]# yum list percona-xtrabackup*

通过yum方式安装percona-xtrabackup:

[root@localhost app]# yum install percona-xtrabackup-24.x86_64

3、Xtrabackup备份原理

1. xtrabackup工具介绍

xtrabackup有两个主要的工具:xtrabackup、innobackupex。

xtrabackup只能备份InnoDB和XtraDB两种数据表,而且只有ibd文件,frm文件它不管,恢复时就需要DBA提供frm ,同时,xtrabackup做备份的时候不能备份表结构、触发器等等。

innobackupex是perl脚本对xtrabackup的封装和功能扩展。 innobackupex可以备份和恢复MyISAM、 InnoDB和XtraDB表以及frm文件,所以我们使用innobackupex来备份MySQL数据库。
Xtrabackup以及innobackupex是根据my.cnf配置文件来获取备份的文件,同时,需要连接到数据库和datadir操作权限。

需要注意的是:innobackupex在备份MyISAM表之前要对全库进行加READ LOCK,会阻塞写操作,若备份是在从库上进行的话会影响主从同步,造成延迟。对InnoDB表备份不会阻塞读写。

2. xtrabackup备份恢复过程

在InnoDB内部会维护一个redo日志文件,我们也可以叫做事务日志文件。事务日志会存储每一个InnoDB表数据的记录修改。当InnoDB启动时,InnoDB会检查数据文件和事务日志,并执行两个步骤:它应用(前滚)已经提交的事务日志到数据文件,并将修改过但没有提交的数据进行回滚操作。

xtrabackup在启动时会记住log sequence number(LSN),并且复制所有的数据文件。复制过程需要一些时间,所以这期间如果数据文件有改动,那么将会使数据库处于一个不同的时间点。这时,xtrabackup会运行一个后台进程,用于监视事务日志,并从事务日志复制最新的修改。

xtrabackup必须持续的做这个操作,是因为事务日志是会轮转重复的写入,并且事务日志可以被重用。所以xtrabackup自启动开始,就不停的将事务日志中每个数据文件的修改都记录下来。

Innobackupex会启动xtrabackup,xtrabackup准备复制数据文件前,首选执行FLUSH TABLES WITH READ LOCK来阻止新的写入进来,同时把MyISAM表数据刷到硬盘上,然后开始复制MyISAM数据文件,文件复制完成,最后释放锁。

以上就是xtrabackup的备份过程。

接下来是准备(prepare)过程。在这个过程中,xtrabackup使用之前复制的事务日志,对各个数据文件执行灾难恢复(就像MySQL刚启动时要做的一样)。当这个过程结束后,数据库就可以做恢复还原了。

备份MyISAM和InnoDB表最终会处于一致,在准备(prepare)过程结束后,InnoDB表数据已经前滚到整个备份结束的点,而不是回滚到xtrabackup刚开始时的点。这个时间点与执行FLUSH TABLES WITH READ LOCK的时间点相同,所以MyISAM表数据与InnoDB表数据是同步的。类似Oracle的,InnoDB的prepare过程可以称为recover(恢复),MyISAM的数据复制过程可以称为restore(还原)。

4、利用xtrabackup进行完全备份

1. innobackupex常用选项

--host:指定数据库服务器地址
--port:指定连接到数据库服务器的哪个端口
--socket:连接本地数据库时使用的套接字路径
--no-timestamp:在使用innobackupex进行备份时,可使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录;如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据
--default-files:可通过此选项指定其它的配置文件;但是使用时必须放于所有选项的最前面
--incremental:指定创建增量备份
--incremental-basedir:指定基于哪个备份做增量备份
--apply-log:应用xtrabackup_logfile文件,重做已提交的事务,回滚未提交的事务
--redo-only:只重做已提交的事务,不准加滚
--use-memory:在“准备”阶段可提供多少内存以加速处理,默认是100M
--copy-back:恢复备份至数据库服务器的数据目录
--compact:压缩备份
--stream={tar|xbstream}:对备份的数据流式化处理 

2. 通过innobackupex 进行全备份的过程

1)创建备份用户

grant reload,lock tables,replication client,create tablespace,super on *.* to bakuser@'172.16.213.%' identified by '123456';

2)进行全库备份

innobackupex --user=DBUSER --host=SERVER --password=DBUSERPASS  --socket=path  /path/to/BACKUP-DIR

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

3)一个全备份例子

[root@localhost mnt]# innobackupex --defaults-file=/etc/my.cnf --user=root  --password=123456  --socket=/tmp/mysqld.sock      /data/backup/full/ 

 /data/backup/full/是将备份存放的目录。

innobackupex或者xtrabackup通过--user和--password连接到数据库服务,--defaults-file指定mysql配置文件目录。

在备份的同时,innobackupex还会在备份目录中创建xtrabackup_checkpoints文件。

内容如下:      

backup_type = full-backuped      #备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)
from_lsn = 0        #备份起始的LSN(日志序列号),每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN,每个页面相关的LSN能够表明此页面最近是如何发生改变的。
to_lsn = 119232396    #备份结束的LSN(日志序列号)
xtrabackup_binlog_info #mysql服务器当前正在使用的二进制日志文件及至备份此刻为止二进制日志事件的位置。
xtrabackup_logfile #事务日志记录文件,用于在prepared阶段进行redo重做和日志回滚。
xtrabackup_info #有关此次备份的各种详细信息
backup-my.cnf #备份命令用到的配置选项信息

5、Innobackupex完全恢复数据库

1. Innobackupex完全备份Mysql原理

1. 首先会启动一个xtrabackup_log后台检测的进程,实时检测mysql redo的变化,一旦发现redo有新的日志写入,立刻将日志写入到日志文件xtrabackup_logfile中;

2. 复制innodb的数据文件和系统表空间文件idbdata1到对应的以默认时间戳为备份目录的地方;

3. 复制结束后,执行flush table with read lock操作;

4. 复制.frm,MYI,MYD文件;

5. 并且在这一时刻获得binary log 的位置;

6. 将表进行解锁unlock tables;

7. 停止xtrabackup_log进程;

2. 通过Innobackupex完全恢复数据库原理

全库恢复过程:这一阶段会启动xtrabackup内嵌的innodb实例,将xtrabackup日志xtrabackup_Log进行回放,将提交的事务信息变更应用到innodb数据或表空间,同时回滚未提交的事务。

3. Innobackupex完全恢复数据库案例

1)prepare数据库

在备份完成后,数据尚且不能直接用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务,而且备份过程中可能还有数据的更改动作,此时xtrabackup_logfile就可派上用场了。

xtrabackup会解析该文件,对事务已经提交但数据还没有写入的部分,进行redo重做;将已经写到数据文件,但未提交的事务通过undo进行回滚,最终使得数据文件处于一致性状态。

Prepare过程是通过使用innobakupex命令的 --apply-log 选项实现的:

[root@localhost mnt]#  innobackupex --apply-log  /data/backup/full/2018-05-21_12-04-52/
成功则会输出:
111225  1:01:57  InnoDB: Shutdown completed; log sequence number 1609228
111225 01:01:57  innobackupex: completed OK!

成功后,这个完全备份就可以被用来还原数据库了。

prepare的过程,其实是读取备份文件夹中的配置文件,然后innobackupex重做已提交事务,回滚未提交事务,之后数据就被写到了备份的数据文件(innodb文件)中,并重建日志文件。

2)恢复数据库

使用innobackupex --copy-back来还原备份(recovery)

[root@localhost mnt]#  innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /data/backup/full/2018-05-21_12-04-52/

innobackupex会根据my.cnf的配置,将所有备份数据复制到my.cnf里面指定的datadir路径下。
如果恢复成功,最后会有如下提示:

innobackupex: Finished copying back files.
160422 17:34:51  innobackupex: completed OK!

注:datadir必须是为空的,innobackupex --copy-back不会覆盖已存在的文件,还要注意,还原时需要先关闭mysql服务,如果服务是启动的,那么就不能还原到datadir。

3)修改权限启动数据库

默认情况下是通过root用户恢复的数据,所以mysql数据文件夹目录是root权限,需要修改文件的所有者和权限:

$ chown -R mysql:mysql /db/data

最后启动数据库即可。

6、xtrabackup进行增量备份

所谓的增量,一定是在已有全量的基础之上的,不然是没有任何意义的。innobackupex增量备份过程中的"增量"处理,其实主要是相对innodb而言,对myisam和其他存储引擎而言,它仍然是全拷贝(全备份)。

"增量"备份的过程主要是通过拷贝innodb中有变更的"页"(这些变更的数据页指的是"页"的LSN大于xtrabackup_checkpoints中给定的LSN)。增量备份是基于全备的,第一次增备的数据必须要基于上一次的全备,之后的每次增备都是基于上一次的增备,最终达到一致性的增备。增量备份的过程如下,和全备的过程类似,区别仅在第2步。

在进行增量备份时,首先要进行一次全量备份,第一次增量备份是基于全备的,之后的增量备份是基于上一次的增量备份,以此类推。

全备份:

[root@MySQL-01 ~]# innobackupex --defaults-file=/etc/my.cnf --user=root  --password=123456 --socket=/tmp/mysqld.sock     /data/backup/full/

第一次增量备份:

[root@MySQL-01 ~]# innobackupex --defaults-file=/etc/my.cnf --user=root  --password=123456 --socket=/tmp/mysqld.sock  --incremental /data/backup/incremental/   --incremental-basedir=/data/backup/full/2018-05-21_12-04-52   --parallel=2

第二次增量备份:

[root@MySQL-01 ~]# innobackupex --defaults-file=/etc/my.cnf --user=root  --password=123456 --socket=/tmp/mysqld.sock  --incremental /data/backup/incremental/  --incremental-basedir=/data/backup/incremental/2018-05-21_12-11-18/ --parallel=2

7、xtrabackup增量备份恢复

增量备份的恢复大体为3个步骤:

1)恢复完全备份;

2)恢复增量备份到完全备份(开始恢复的增量备份要添加--redo-only参数,到最后一次增量备份去掉--redo-only参数);

3)对整体的完全备份进行恢复,回滚那些未提交的数据;


 

增量备份的恢复:

1)恢复完全备份(注意这里一定要加--redo-only参数,该参数的意思是只应用xtrabackup日志中已提交的事务数据,不回滚还未提交的数据)一个事务在前一个备份中没有提交,但可能在其后的备份中提交了,这种情况就需要--redo-only参数。

[root@MySQLdb ~]# innobackupex --apply-log --redo-only /data/backup/full/2018-05-21_12-04-52/

2)将增量备份1应用到完全备份

[root@MySQLdb ~]# innobackupex --apply-log --redo-only /data/backup/full/2018-05-21_12-04-52/ --incremental-dir=/data/backup/incremental/2018-05-21_12-11-18/

3)将增量备份2应用到完全备份(注意恢复最后一个增量备份时需要去掉--redo-only参数,回滚xtrabackup日志中那些还未提交的数据)

[root@MySQLdb ~]# innobackupex --apply-log /data/backup/full/2018-05-21_12-04-52/ --incremental-dir=/data/backup/incremental/2018-05-21_14-28-40/

4)把所有合在一起的完全备份整体进行一次apply操作,回滚未提交的数据:

[root@MySQLdb ~]# innobackupex --apply-log /data/backup/full/2018-05-21_12-04-52/

5)把恢复完的备份复制到数据库目录文件中,赋权,然后启动mysql数据库,检测数据正确性

[root@MySQLdb ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /data/backup/full/2018-05-21_12-04-52/

8、xtrabackup针对海量数据的备份优化

使用流特性,需要指定--stream选项,使用tar备份:(推荐方法)

innobackupex  --defaults-file=/etc/my.cnf --user=root  --password=123456  --socket=/tmp/mysqld.sock  --stream=tar  /data/backup/tgz  --parallel=4 | gzip  > / data/backup/tgz/mysqlbak1.tar.gz

备份到远程主机:

innobackupex  --defaults-file=/etc/my.cnf --user=root  --password=123456  --socket=/tmp/mysqld.sock  --stream=tar  /data/backup/tgz|ssh [email protected]  "gzip >/data/backup/tgz/mysqlbak1.tar.gz"

可用参数:

--parallel=4:  加速备份,这个选项会指定xtrabackup备份文件的线程数。

提取tar流,需要加i参数:

$ tar -xizvf mysqlbak1.tar.gz

9、通过xtrabackup进行mysql备份恢复综合案例

1. 对mysql的cmsdb库进行备份

innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456  --databases=cmsdb  --stream=tar  /data/back_data/ 2>/data/back_data/cmsdb.log | gzip  >/data/back_data/cmsdb.tar.gz

说明:

--database=cmsdb :单独对cmsdb数据库做备份 ,若是不添加此参数那就那就是对全库做备份
2>/data/back_data/cmsdb.log  输出信息写入日志中
gzip >/data/back_data/cmsdb.tar.gz 打包压缩存储到该文件中

2. 此处可以写个脚本做备份(backup.sh)

#!/bin/sh
echo "开始备份..."`date`
log=cmsdb_`date +%y%m%d%H%M`.log
str=cmsdb_`date +%y%m%d%H%M`.tar.gz
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --database=cmsdb  --stream=tar /data/back_data/ 2>/data/back_data/$log | gzip  >/data/back_data/$str
echo "备份完毕..."`date`

3. 恢复数据

1) 先停止数据库

service mysqld stop

2) 解压

tar -izxvf cmsdb.tar.gz -C /data/back_data/db/  

注:没有db ,需要mkdir /data/back_data/db/。

3) 恢复

innobackupex --defaults-file=/etc/my.cnf --user=root --password  --apply-log /data/back_data/db/  
innobackupex --defaults-file=/etc/my.cnf --user=root --password  --copy-back /data/back_data/db/

4) 赋权

chown -R mysql.mysql /var/lib/mysql/*

5) 重启数据库

service mysqld restart

猜你喜欢

转载自blog.csdn.net/qq_35029061/article/details/126793740