前几天有个新闻, 说是 gitlab 的工程师把数据文件给误删了, 搞了个大事件, 很多人都去围观了. 备份工作应该在最开始的时候就要做, 否则就会失去最佳时机, 为了保证我的数据是安全的, 因此我要搞备份了. 备份分为逻辑备份和物理备份, 逻辑备份是导 sql, 物理备份是基于文件的, 这两种我都搞一下.
开启 binlog
首先第一件事是打开 binlog 日志, 编辑 mysql 配置文件开启一下, 默认是关闭的. 编辑 /etc/my.cnf , log-bin=mysqlbinlog = 号后面的是 binlog 日志的名字, 默认生成在数据目录里面, 重启一下 mysql 服务 , service mysqld restart
查看 mysql 的数据目录 , /var/lib/mysql ,mysqlbinlog.000001 等文件就是 binlog 日志文件.
添加一些测试数据
建数据库, 建表和插入一些记录, 用于测试, 表的存储引擎选择 innodb, 因为这个引擎容易测出来问题
- #建库
- create database entmail charset=utf8;
- #建表,存储引擎选用innodb
- create table user( id int auto_increment primary key, name varchar(100) not null default '' ) engine=innodb;
- #插记录
- insert into user values(null,'shihan');
- insert into user values(null,'shihan1');
- insert into user values(null,'shihan2');
- insert into user values(null,'shihan3');
小数据量使用 mysqldump 逻辑备份
第一想到的备份方式是使用 mysqldump, 导出 sql 语句, 恢复的时候就再次导入 sql 语句.
针对我的数据库, 用户名 root 密码空, 我放 sql 文件的位置是 / home/shihan1/mysql/sqls/ , 备份所有数据库, 我的导出命令是下面这句
- mysqldump -uroot --all-databases > /home/shihan1/mysql/sqls/all.sql
此时, 我误删了数据库 entmail , drop database entmail
不着急, 马上进行恢复, 执行以下导入命令, 数据库立刻就回来了, 注意一个是 mysqldump 命令, 一个是 mysql 命令
- mysql -uroot < /home/shihan1/mysql/sqls/all.sql
为啥不能用拷贝数据目录的方式备份
有的同学会使用直接拷贝数据目录的方式备份, 我也测试了一下, 实际证明这种方式是不正确的. 我用 tar 命令把数据目录整个打包搬走, 然后删除整个数据目录, 再搬回来.
因为我把 mysql 的那几张用户表啥的都删了, mysql 会进行重新初始化
我把数据文件再搬回来, 然后进 mysql 看看, 结果是这样的, 告诉我 user 表不存在了, 这张表是 innodb 引擎的, 所以不能使用这种方式, 幸亏我有前面的逻辑备份, 从新导一下, 数据又回来了.
mysql -uroot < /home/shihan1/mysql/sqls/all.sql
使用第三方软件 percona-xtrabackup 实现物理备份
可以实现物理备份的软件与很多, mysql 也有企业版备份工具, 但是貌似是收费的, percona-xtrabackup 这个开源软件可以很好的实现全量备份和增量备份.
前往这个地址下载 rpm 包, 里面可以选择版本, 我最开始选的最新版 2.4.6, 结果报这个错误: Error: Built-in InnoDB in MySQL 5.1 is not supported in this release. You can either use Percona XtraBackup 2.0, or upgrade to InnoDB plugin. 然后从新下了个 2.0.0 版是可以的.
https://www.percona.com/downloads/XtraBackup/
- #下载rpm
- wget https://www.percona.com/downloads/XtraBackup/XtraBackup-2.0.0/RPM/rhel6/x86_64/percona-xtrabackup-2.0.0-417.rhel6.x86_64.rpm
- #安装rpm
- rpm -i percona-xtrabackup-2.0.0-417.rhel6.x86_64.rpm
- #安装需要的依赖
- yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL perl-MD5 rsync libev numactl
开始备份了
当前数据:
1. 我先把所有数据全量备份一次, 后面那个目录是备份保存的目录, 执行完成后出现 innobackupex: completed OK! 代表成功, 生成的备份文件 2017-02-24_17-47-55
- innobackupex --user=root /home/shihan1/mysql/backups/
2. 添加几条新数据进去, 现在的数据情况
- insert into user values(null,'shihan4');
- insert into user values(null,'shihan5');
3. 增量备份一次, 就多了一个参数 --incremental , 增量备份生成的文件是 2017-02-24_17-51-32 , 数据的大小也是不一样的
- innobackupex --user=root --incremental /home/shihan1/mysql/backups/
4. 此时发生灾变, 我把数据目录给删了! rm -rf /var/lib/mysql/* ,mysql 已经连不上了
5. 抓紧恢复数据 , 准备全量备份文件 , 合并增量备份文件 , 执行恢复
- #准备全量备份文件
- innobackupex --apply-log --redo-only /home/shihan1/mysql/backups/2017-02-24_17-47-55/
- #合并增量备份文件,注意看目录名
- #如果有多次增量备份,就多次执行 innobackupex --apply-log --redo-only 增量目录 --incremental-dir 增量目录
- innobackupex --apply-log --redo-only /home/shihan1/mysql/backups/2017-02-24_17-47-55/ --incremental-dir /home/shihan1/
- mysql/backups/2017-02-24_17-51-32/
- #执行恢复
- innobackupex --copy-back /home/shihan1/mysql/backups/2017-02-24_17-47-55
6. 数据已经回来了, 重新修改一下数据文件的属组和属主 chown mysql:mysql -R /var/lib/mysql/* , 重启一下 mysql , 数据全部恢复
下一篇定时执行备份脚本
来源: http://www.cnblogs.com/taoshihan/p/6437468.html