首页 > 代码库 > mysql热备份完全备份

mysql热备份完全备份

使用xtrabackup 做完全备份。
我们安装完xtrabackup之后,它给我们提供了几个命令行工具
其中我们备份要使用的命令是innobackupex,这是一个脚本它在内部封装了几个xtrabackup的几个命令行,使得innobackupex使用起来会非常简化
 
首先去官网下载rpm包安装之后就可以使用了
这工具一般用于本地备份,如果需要远程连接某个数据库进行备份还需要借助其他工具。
 
完全备份:一般而言备份就是执行数据导出
命令 xtrabackupex --user=xx     --password=xx    /save/to/path
这样就可以实现完全备份,将整个数据库的所有数据进行备份到指定的路径
需要注意的是,必须是有执行备份权限的用户才可以备份。
我们可以专门创建一个用户给他reload, lock tables,  replication client 这三个权限就行
 
比如:
创建用户
CREATE USER ‘backup‘@‘localhost‘ IDENTIFIED BY ‘pwd‘ ;
将其所有权限收回
 REVOKE ALL PRIVILEGES, GRANT OPTION FROM backup@‘localhost‘;
重新授权之后备份权限
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO ‘backup‘@‘localhost‘;
重新刷新授权表
FLUSH PRIVILEGES;
 
比如我们备份所有库
 
innobackupex -user=root -password=‘abc‘  /mysql-backup
 
执行之后会自动创建mysql-backup目录,无需我们手动创建。备份好之后会在我们备份目录下面生成一个以当前时间为名字的目录。
这个以当前时间命名的目录里面主要包含了以下文件
1. 我们备份我所有数据库的名称
2. 我们的表空间文件
3. mysql的配置文件
4. 二进制日志文件,备份这一刻你的二进制文件名,以及postion位置
如果不会自动创建备份目录则会报错:我们需要手动创建目录,并且将目录的属主,属组改为mysql
 
备份好之后还需要进行一些操作
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含,尚未提交的事务,或者已经提交,但是尚未同步到数据文件中的事务。因此,此时数据文件仍然处于不一致状态。因此我们需要进行一些准备操作。这个工作的主要作用是通过回滚未提交的事务。以及同步以及提交的事务到数据文件中,使得数据文件处于一致状态
 
使用 --apply-log 选项可以实现上述功能。比如:
innobackupex --apply-log  /path/to/backup-dir
 
后面跟上了指定的已经备份好的数据,保存的路径,就可以实现上述工作
 
只有执行了这个,才能用备份的数据进行恢复
 
 
我们备份好之后,万一我们的数据库又发生了改变呢,因为是在线数据库,随时有用户存储数据的。
 
这种情况下我们就需要使用二进制日志进行即时点恢复。
因此二进制日志非常重要。
我们备份完之后,还需要对二进制日志进行备份,二进制日志一般保存在数据目录下面,命名一般是mysql-bin.00000x
备份二进制日志之前,先登录mysql 执行一下刷新日志flush logs;
这样刷新之后就会产生一个新的二进制日志,我们再备份那个老的就行。
直接复制这个文件到
 
 
实现还原:
 
假如我们已经备份好了日志文件,以及使用xtrabackup对数据库进行了一次全备份。
我们数据库出现故障了,我们需要还原。注意,使用xtrabackup实现
还原数据在数据库关闭的状态进行还原
还原数据:
使用innobackupex --cpoy-back /path/to/backup-dir
后面跟上你的备份数据时候,数据保存的路径
 
注意,恢复后的数据文件还是保存在你原来的数据目录下面,如果这个数据属主,属组都变成root的话,需要将其改变为mysql
chown -R mysql.mysql  /path/to/data
 
 
然后登陆上数据库,进行二进制日志恢复。
首先找到我们备份的二进制文件路径
将其读取出来保存的另外的文件后缀名为 .sql,使用mysqlbinlog 命令,
比如
mysqlbinlog /root/mysql-bin.000001 >/root/abc.sql
 
然后连接到mysql数据库,进行二进制日志恢复
 
mysql>set sql_log_bin=0;
 
 
mysql>source /root/abc.sql;
 
mysql>set sql_log_bin=1;
 
如果没有报错就完成了
 
我们到一定要定期的对二进制日志进行手动备份
 
 
 

mysql热备份完全备份