本文通过使用mysql自带的mysqldump和最有名开源工具Xtrabackup进行对数据库进行备份,保证数据的安全性。


使用Mysqldump 温备份单个数据库:


1.mysql交互式模式下施加读锁,以免写入数据有差错;

mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)

2.新建一个存放的文件夹,存放备份文件

[ root@yulong ~]# mkdir -pv /backup/data

3 .备份单个数据库中的表

[root@yulong backup]# mysqldump -uroot -predhat --master-data=2 --databases hellodb --lock-all-tables > /backup/`date +%F`
--master-data=2           记录备份的时候二进制文件
--databases hellodb       备份的数据库
--lock-all-tables         锁定所有表
[root@yulong backup]# mysqldump --help 使用--help显示更多mysqldump选项

4.然后查看下这个文件,里面可以看到bak的详细信息

[root@yulong backup]# cat bak.2013-09-06

5.备份完成后释放读锁

mysql> unlock tables;
Query OK, 0 rows affected (0.06 sec)

6.然后删除这个hellodb这个库

mysql> drop database hellodb;
Query OK, 7 rows affected (0.01 sec)

7.让后再用刚才的备份进行恢复;

mysql -uroot -predhat < /backup/bak.2013-09-06

8.查看删除的是否恢复

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
| yulong             |


使用mysqldump热备InnoDB引擎整个数据库

1.热备份数据库

[root@yulong backup]# mysqldump -uroot -predhat --single-transaction --events --routines  --master-data=2 --all-databases > /backup/full.`date +%F`.sql
--single-transaction    基于此选项能实现热备InnoDB表
--events                备份事件调度器代码;
--routines              备份存储过程和存储函数;


2. 然后在创建一个增量备份的数据库

mysql> create databases yulong;
Query OK, 1 row affected (0.04 sec)
mysql> use yulong;
Database changed
mysql> create table nihao (beijing char(30) primary key, diqu varchar(50) not null);

3.在到刚才完全备份的文件里查看--master-data记录的值

[root@yulong backup]# head -30 full.2013-09-06.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000019', MASTER_LOG_POS=676;

4. 然后查看二进制文件事件的position

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000019 |     1320 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

5.把他们这段二进制值给保存到一个目录下

[root@yulong backup]# mysqlbinlog  --start-position=676   --stop-position=1320  /mybinlog/mysql-bin.000019 > /backup/zl.sql

6.暂时关闭二进制log文件,恢复的二进制日志我们不需要记录

mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)

7.然后删除数据库

mysql> drop database yulong;
Query OK, 1 row affected (0.06 sec)
mysql> drop database hellodb;
Query OK, 7 rows affected (0.00 sec)

8.恢复刚才备份的数据

[root@yulong backup]# mysql -uroot -predhat  </backup/full.2013-09-06.sql      恢复全部备份
[root@yulong backup]# mysql -uroot -predhat  </backup/zl.sql 恢复增量备份

9.验证数据,删除的数据库是否恢复,我这里OK没有题

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
| yulong             |
+--------------------+

Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDBHotbackup的一个很好的替代品。

(1)备份过程快速、可靠;

(2)备份过程不会打断正在执行的事务;

(3)能够基于压缩等功能节约磁盘空间和流量;

(4)自动实现备份检验;

(5)还原速度快;


rpm安装之前先安装依赖包:

perl-DBD-MySQL.x86_64

最新版本下载地址:http://www.percona.com/software/percona-xtrabackup

1.完全备份必须在服务启动不情况下

[root@yulong data]# service mysqld start
Starting MySQL....                                         [  OK  ]

2.新建一个备份目录

[root@yulong data]# mkdir   -pv /backup

3.完全备份命令

[root@yulong data]#innobackupex  --user=root  --password=redhat  /backup/

4.备份完成后自动生成一个日期文件

[root@yulong ~]# cd /backup/2013-09-06_15-37-02

5.然后停止服务和删除存储数据库的目录所有文件

[root@yulong ~]# service  mysqld  stop
Shutting down MySQL.                                       [  OK  ]
 [root@yulong data]# rm  -rf *            我的存放数据库的目录是data下

6.准备(prepare)一个完全备份

         一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态innobakupex命令的--apply-log选项可用于实现上述功能

[root@yulong ~]# innobackupex --apply-log  /backup/2013-09-06_15-37-02/
如果执行正确,其最后输出的几行信息通常如下:
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
120407  9:01:36  InnoDB: Starting shutdown...
120407  9:01:40  InnoDB: Shutdown completed; log sequence number 92036620
120407 09:01:40  innobackupex: completed OK!

7.从一个完全备份中恢复数据,恢复数据切记不要启动服务

root@yulong data]# innobackupex --copy-back   /backup/2013-09-06_15-37-02/
--copy-back    选项用于执行恢复操作
如果执行正确,其输出信息的最后几行通常如下:
innobackupex: Starting to copy InnoDB log files
innobackupex: in '/backup/2012-04-07_08-17-03'
innobackupex: back to original InnoDB log directory '/mydata/data'
innobackupex: Finished copying back files.
120407 09:36:10  innobackupex: completed OK!

8.让后修改存放数据库的目录下文件属主和属组

[root@yulong data]# chown  -R mysql:mysql *
[root@yulong data]# ll
total 28700
drwxr-xr-x 2 mysql mysql     4096 Sep  6 16:20 hellodb
-rw-r--r-- 1 mysql mysql 18874368 Sep  6 16:20 ibdata1
-rw-r--r-- 1 mysql mysql  5242880 Sep  6 16:20 ib_logfile0
-rw-r--r-- 1 mysql mysql  5242880 Sep  6 16:20 ib_logfile1
drwxr-xr-x 2 mysql mysql     4096 Sep  6 16:20 mysql
drwxr-xr-x 2 mysql mysql     4096 Sep  6 16:20 performance_schema
drwxr-xr-x 2 mysql mysql     4096 Sep  6 16:20 test
-rw-r--r-- 1 mysql mysql       34 Sep  6 16:20 xtrabackup_binlog_pos_innodb
drwxr-xr-x 2 mysql mysql     4096 Sep  6 16:20 yulong
-rw-r----- 1 mysql mysql     1488 Sep  6 16:23 yulong.err

9.验证服务是否可以正常启动和数据库恢复是否正常

[root@yulong data]# service mysqld start
Starting MySQL..                                           [  OK  ]
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
| yulong             |
+--------------------+
6 rows in set (0.00 sec)

接下来使用innobackupex进行增量备份

1.每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。

[root@localhost data]# innobackupex --user=root --password=redhat  --incremental /backup/  --incremental-basedir=/backup/2013-09-06_15-37-02/
--incremental                   说明是什么备份 ,后面跟要增量备份的路径
--incremental-basedir           指向上一次的增量备份所在的目录

2.停止mysqld服务

[root@localhost data]# service  mysqld stop
Shutting down MySQL...                                     [  OK  ]

3.把数据库损坏进行恢复

[root@localhost data]# rm -rf *  这个是我数据库存放目录

4.恢复完全备份数据

[root@localhost data]# innobackupex --apply-log  --redo-only /backup/2013-09-06_15-37-02/
--apply-log     回滚日志
--redo-only     回滚合并

5.合并第一个增量备份到完全备份里面

[root@localhost data]# innobackupex --apply-log  --redo-only /backup/2013-09-06_15-37-02/  --incremental-dir=/backup/2013-09-07_05-17-17/
执行完结尾部分出现下面的消息表示成功了
innobackupex: completed OK!

6.恢复全部数据库

[root@localhost data]# innobackupex --copy-back   /backup/2013-09-06_15-37-02/

7.修改恢复数据库目录中文件的权限

[root@localhost data]# chown  -R  mysql:mysql *
[root@localhost data]# ll
total 28700
drwxr-xr-x 2 mysql mysql     4096 Sep  7 05:56 hellodb
-rw-r--r-- 1 mysql mysql 18874368 Sep  7 05:56 ibdata1
-rw-r--r-- 1 mysql mysql  5242880 Sep  7 05:56 ib_logfile0
-rw-r--r-- 1 mysql mysql  5242880 Sep  7 05:56 ib_logfile1
-rw-r----- 1 mysql mysql     3036 Sep  7 05:59 localhost.localdomain.err
drwxr-xr-x 2 mysql mysql     4096 Sep  7 05:56 mysql
drwxr-xr-x 2 mysql mysql     4096 Sep  7 05:56 performance_schema
drwxr-xr-x 2 mysql mysql     4096 Sep  7 05:56 qq

8.启动服务,正常恢复

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| qq                 |
| test               |
| yulong             |
+--------------------+
7 rows in set (0.00 sec)
mysql> use qq;
mysql> select * from  wangluo
+----------+----+-------+
| Name     | ID | Scale |
+----------+----+-------+
| qq       |  1 | big   |
| baidu    |  2 | big   |
| wangyi   |  3 | big   |
| taobao   |  4 | big   |
| jingdong |  5 | big   |
+----------+----+-------+
5 rows in set (0.00 sec)