一、Mysql备份策略:

完整备份:

完整备份就是指对某一个时间点上的所有数据或应用进行的一个完整拷贝,对数据量大的,备份时间较长,当然数据在恢复的时候快。

增量备份:

备份自上一次备份(包括完整备份,差异备份,增量备份)之后所有变化的数据进行备份。恢复的时候只需要一次完整的备份加上完整备份后的多个增量备份进行恢复即可。

差异备份:

备份自上一次完整备份之后所有变化的数据,恢复的时候仅需要最新一次完整备份加上差异备份即可。

详细如下图所示:

备份方式:

1、使用 mysqldump 进行逻辑备份

2、使用 LVM 快照备份:

快照备份就是把当时的场景保存为一个不变的状态,然后对这个不变的状态进行备份。但然,在规划mysql数据库时最好将数据和日志分开放到lvm分区中。使用LVM快照备份,需要将数据放在lvm分区。

3、Xtrabackup备份:

备份原理:

XtraBackup 基于 InnoDB 的 crash-recovery 功能。 它会复制 innodb 的data file ,由于不锁表,复制出来的数据是不一致的, 在恢复的时候使用 crash-recovery ,使得数据恢复一致。 InnoDB 维护了一个 redo log ,又称为 transaction log ,事务日志, 它包含了 innodb 数据的所有改动情况。

当InnoDB启动的时候,它会先去检查datafile和transaction log,并且会做二步操作:

1.Itapplies committed transaction log entries to the data files

2.itperforms an undo operation on any transactions that modified data but did notcommit.

XtraBackup在备份的时候,一页一页地复制innodb的数据,而且不锁定表,

与此同时,XtraBackup还有另外一个线程监视着transactionslog,

一旦log发生变化,就把变化过的logpages复制走。

为什么要急着复制走呢?前几章的时候就提过这个问题,

因为transactions log文件大小有限,写满之后,就会从头再开始写,

所以新数据可能会覆盖到旧的数据。

在prepare过程中,XtraBackup使用复制到的transactionslog 对备份出来的innodb data file 进行crash recovery。

用mysqldump实现备份:

首先,mysqldump是mysql的一个客户端工具,可以实现备份整个服务器、单个或部分数据库、单个或部分表、表中的某些行,存储过程,存储函数,触发器等,能自动记录备份时的二进制日志文件及相应的position值

二、详解用mysqldump实现备份恢复操作:

首先,mysqldump是mysql的一个客户端工具,可以实现备份整个服务器、单个或部分数据库、单个或部分表、表中的某些行,存储过程,存储函数,触发器等,能自动记录备份时的二进制日志文件及相应的position值

对mysqldump参数说明:

--all-databases  , -A      // 导出全部数据库。

--all-tablespaces  , -Y     // 导出全部表空间。

--no-tablespaces  , -y     // 不导出任何表空间信息。

--add-drop-database     // 每个数据库创建之前添加drop数据库语句。

--add-drop-table                 // 每个数据表创建之前添加drop数据表语句。(默认为打开状态,使用--skip-add-drop-table取消选项)

--add-locks                    // 在每个表导出之前增加LOCK TABLES并且之后UNLOCK  TABLE。(默认为打开状态,使用--skip-add-locks取消选项)

--allow-keywords          // 允许创建是关键词的列名字。这由表名前缀于每个列名做到。

--apply-slave-statements // 在'CHANGE MASTER'前添加'STOP SLAVE',并且在导出的最后添加'START SLAVE'。

--character-sets-dir        // 字符集文件的目录

--comments                   // 附加注释信息。默认为打开,可以用--skip-comments取消

--compatible                  // 导出的数据将和其它数据库或旧版本的MySQL 相兼容。值可以为ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options等,

要使用几个值,用逗号将它们隔开。它并不保证能完全兼容,而是尽量兼容。

--compact                      // 导出更少的输出信息(用于调试)。去掉注释和头尾等结构。可以使用选项:--skip-add-drop-table  --skip-add-locks --skip-comments --skip-disable-keys

--complete-insert,  -c     // 使用完整的insert语句(包含列名称)。这么做能提高插入效率,但是可能会受到max_allowed_packet参数的影响而导致插入失败。

--compress, -C      // 在客户端和服务器之间启用压缩传递所有信息

--create-options,  -a      // 在CREATE TABLE语句中包括所有MySQL特性选项。(默认为打开状态)

--databases,  -B      // 导出几个数据库。参数后面所有名字参量都被看作数据库名。

--debug          // 输出debug信息,用于调试。默认值为:d:t:o,/tmp/mysqldump.trace

--debug-check    // 检查内存和打开文件使用说明并退出。

--debug-info       // 输出调试信息并退出

--delete-master-logs           //master 备份后删除日志. 这个参数将自动激活--master-data。

--disable-keys           // 对于每个表,用/*!40000 ALTER TABLE tbl_name DISABLE KEYS */;和/*!40000 ALTER TABLE tbl_name ENABLE KEYS */;语句引用INSERT语句。这样可以更快地导入dump出来的文件,因为它是在插入所有行后创建索引的。该选项只适合MyISAM表,默认为打开状态。

--dump-slave // 该选项将导致主的binlog位置和文件名追加到导出数据的文件中。设置为1时,将会以CHANGE MASTER命令输出到数据文件;设置为2时,在命令前增加说明信息。该选项将会打开--lock-all-tables,除非--single-transaction被指定。该选项会自动关闭--lock-tables选项。默认值为0。

--events, -E      // 导出事件。

--flush-logs   // 开始导出之前刷新日志。

请注意:假如一次导出多个数据库(使用选项--databases或者--all-databases),将会逐个数据库刷新日志。除使用--lock-all-tables或者--master-data外。在这种情况下,日志将会被刷新一次,相应的所以表同时被锁定。因此,如果打算同时导出和刷新日志应该使用--lock-all-tables 或者--master-data 和--flush-logs。

--flush-privileges // 在导出mysql数据库之后,发出一条FLUSH  PRIVILEGES 语句。为了正确恢复,该选项应该用于导出mysql数据库和依赖mysql数据库数据的任何时候。

--ignore-table     // 不导出指定表。指定忽略多个表时,需要重复多次,每次一个表。每个表必须同时指定数据库和表名。

--lock-all-tables,  -x // 提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭--single-transaction 和--lock-tables 选项。

mysqldump  -uroot -p --host=localhost --all-databases --lock-all-tables

--lock-tables,  -l      // 开始导出前,锁定所有表。用READ  LOCAL锁定表以允许MyISAM表并行插入。对于支持事务的表例如InnoDB和BDB,--single-transaction是一个更好的选择,因为它根本不需要锁定表。

请注意当导出多个数据库时,--lock-tables分别为每个数据库锁定表。因此,该选项不能保证导出文件中的表在数据库之间的逻辑一致性。不同数据库表的导出状态可以完全不同。

--log-error     // 附加警告和错误信息到给定文件

--master-data // 该选项将binlog的位置和文件名追加到输出文件中。如果为1,将会输出CHANGE MASTER 命令;如果为2,输出的CHANGE  MASTER命令前添加注释信息。该选项将打开--lock-all-tables 选项,除非--single-transaction也被指定(在这种情况下,全局读锁在开始导出时获得很短的时间;其他内容参考下面的--single-transaction选项)。该选项自动关闭--lock-tables选项。

--no-create-db,  -n   // 只导出数据,而不添加CREATE DATABASE 语句。

--no-create-info,  -t

只导出数据,而不添加CREATE TABLE 语句。

mysqldump  -uroot -p --host=localhost --all-databases --no-create-info

--no-data, -d       // 不导出任何数据,只导出数据库表结构。

--order-by-primary  // 如果存在主键,或者第一个唯一键,对每个表的记录进行排序。在导出MyISAM表到InnoDB表时有效,但会使得导出工作花费很长时间。

--quick, -q     // 不缓冲查询,直接导出到标准输出。默认为打开状态,使用--skip-quick取消该选项。

--opt         // 同时启用各种高级选项

--routines, -R      // 导出存储过程以及自定义函数。

--single-transaction // 该选项在导出数据之前提交一个BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于多版本存储引擎,仅InnoDB。本选项和--lock-tables 选项是互斥的,因为LOCK  TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用--quick 选项。

--dump-date       // 将导出时间添加到输出文件中。默认为打开状态,使用--skip-dump-date关闭选项。

--skip-opt           // 禁用–opt选项.

--socket,-S     // 指定连接mysql的socket文件位置,默认路径/tmp/mysql.sock

--triggers       // 导出触发器。该选项默认启用,用--skip-triggers禁用它。

--user, -u        // 指定连接的用户名。

--verbose, --v           // 输出多种平台信息。

--version, -V        // 输出mysqldump版本信息并退出

实例详解 : 操作时数据库以及库中的表可以自己创建,主要讲解备份的过程及其中的要点

详解一:对catidb数据库进行完全备份:

mysql>use catidb;
Databasechanged
mysql>show tables;  //使用catidb数据库查看其中的表
+------------------+
|Tables_in_catidb |
+------------------+
|tb1              |
|tb2              |
+------------------+
2rows in set (0.00 sec)

对catidb数据库进行备份,恢复

[root@localhost~]# mysqldump -uroot -pmypass catidb > /tmp/catidb.sql  //用这种方法对catidb数据库进行备份,在数据库恢复时有一个问题,即该catidb.sql文件中没用创建catidb数据库的语句,在恢复时所含所有表会恢复到当前默认的数据库中,相当的危险,因此需要谨慎,在恢复之前一定要先创建数据库
mysql>drop database catidb;     //备份之后将catidb数据库删除
QueryOK, 2 rows affected (0.07 sec)
mysql>create database catidb;   //在恢复之前一定要先创建数据库,数据库名字可以自己定义
QueryOK, 1 row affected (0.04 sec)
mysql>use catidb;
Databasechanged
mysql>source /tmp/catidb.sql    //进行数据恢复
mysql>show tables;        //恢复成功
+------------------+
|Tables_in_catidb |
+------------------+
|tb1              |
|tb2              |
+------------------+
2rows in set (0.01 sec)

详解二:

利用mysqldump实现从逻辑角度完全备份mysql,配合二进制日志备份实现增量备份

仍以上面的catidb数据库为例先对catidb 数据库进行完全备份

mysql>use catidb;
Databasechanged
mysql>show tables;
+------------------+
|Tables_in_catidb |
+------------------+
|tb1              |
|tb2              |
+------------------+
2rows in set (0.00 sec)

对catidb数据库进行完全备份

[root@localhost~]# mysqldump -uroot -pmypass --single-transaction --master-data=2 --databasescatidb > /backup/catidb_`date +%F`.sql

备份完成之后又对catidb数据库进行了新的操作

mysql>show tables;
+------------------+
|Tables_in_catidb |
+------------------+
|tb1              |
|tb2              |
+------------------+
2rows in set (0.00 sec)
mysql>use catidb
Databasechanged
mysql>create table tb3 (id int);
QueryOK, 0 rows affected (0.11 sec)
mysql>insert into tb3 values (1),(6),(9);
QueryOK, 3 rows affected (0.09 sec)
Records:3  Duplicates: 0  Warnings: 0

进行增量备份: 从上一次完全备份完成后,到所有新的操作之前,那么如何查看记录的位置

开始位置:

[root@localhost~]# less /backup/catidb_2013-09-07.sql
--MySQL dump 10.13  Distrib 5.5.33, forLinux (x86_64)
--
--Host: localhost    Database: catidb
--------------------------------------------------------
--Server version       5.5.33-log
/*!40101SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101SET NAMES utf8 */;
/*!40103SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103SET TIME_ZONE='+00:00' */;
/*!40014SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
--Position to start replication or point-in-time recovery from
--
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=1673;

结束位置:

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

二进制增量备份

[root@localhost~]# mysqlbinlog --start-position=1673 --stop-position=1959/mydata/data/mysql-bin.000004 > /backup/catidb_`date +%F_%H`.sql

之后又进行了一些操作

记录一次此刻二进制日志的位置

mysql>show master status;
+------------------+----------+--------------+------------------+
|File             | Position |Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
|mysql-bin.000004 |     1959 |              |                  |
+------------------+----------+--------------+------------------+
1row in set (0.00 sec)
mysql>use catidb;
Databasechanged
mysql>insert into tb3 values (2),(5);
QueryOK, 2 rows affected (0.11 sec)
Records:2  Duplicates: 0  Warnings: 0

之后不小心删除了catidb数据库

mysql>drop database catidb;

QueryOK, 3 rows affected (0.13 sec)

开始进行恢复操作,首先把所需二进制日志导出来

[root@localhost~]# mysqlbinlog --start-position=1959 /mydata/data/mysql-bin.000004
/*!50530SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019SET @@session.max_insert_delayed_threads=0*/;
/*!50003SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER/*!*/;
#at 4
#130907  5:41:54 server id 1  end_log_pos 107      Start: binlog v 4, server v 5.5.33-log created 130907  5:41:54 at startup
#Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG'
IkwqUg8BAAAAZwAAAGsAAAABAAQANS41LjMzLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAiTCpSEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
'/*!*/;
#at 1959
#130907  9:53:14 server id 1  end_log_pos 2029    Query  thread_id=6    exec_time=0 error_code=0
SETTIMESTAMP=1378518794/*!*/;
SET@@session.pseudo_thread_id=6/*!*/;
SET@@session.foreign_key_checks=1, @@session.sql_auto_is_null=0,@@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET@@session.sql_mode=0/*!*/;
SET@@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\Cutf8 *//*!*/;
SET@@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET@@session.lc_time_names=0/*!*/;
SET@@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
#at 2029
#130907  9:53:14 server id 1  end_log_pos 2124    Query  thread_id=6    exec_time=0 error_code=0
use`catidb`/*!*/;
SETTIMESTAMP=1378518794/*!*/;
insertinto tb3 values (2),(5)
/*!*/;
#at 2124
#130907  9:53:14 server id 1  end_log_pos 2151    Xid = 175
COMMIT/*!*/;
# at 2151
#130907  9:54:04 server id 1  end_log_pos 2236    Query  thread_id=6    exec_time=1 error_code=0
SETTIMESTAMP=1378518844/*!*/;
drop database catidb
/*!*/;
DELIMITER;
#End of log file
ROLLBACK/* added by mysqlbinlog */;
/*!50003SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

注意我们保存的是drop catidb数据库之前的内容,因此需要查看其中的位置,此时为2151

开始导出二进制日志

[root@localhost~]# mysqlbinlog --start-position=1959 --stop-position=2151/mydata/data/mysql-bin.000004 > /tmp/catidb_binlog.sql

开始恢复,此时不需要启动二进制日志

mysql>set sql_log_bin=0;
QueryOK, 0 rows affected (0.00 sec)
mysql>flush logs; //滚动二进制日志
QueryOK, 0 rows affected (0.17 sec)

可以在命令行中进行导入,进行恢复操作,完全备份+增量备份+二进制日志

[root@localhost~]# mysql -uroot -pmypass < /backup/catidb_2013-09-07.sql //恢复完全备份
[root@localhost~]# mysql -uroot -pmypass < /backup/catidb_2013-09-07_09.sql     //恢复增量备份
[root@localhost~]# mysql -uroot -pmypass < /tmp/catidb_binlog.sql      //恢复二进制日志

之后连到Mysql,进行查看

mysql>use catidb;
Databasechanged
mysql>show tables;
+------------------+
|Tables_in_catidb |
+------------------+
|tb1              |
|tb2              |
|tb3              |
+------------------+
3rows in set (0.00 sec)
mysql>select * from tb3;
+------+
|id   |
+------+
|    1 |
|    6 |
|    9 |
|    2 |
|    5 |
+------+
5rows in set (0.00 sec)

备份恢复完成!

注意:对于一般的备份,是针对整个服务器进行备份的因此所用的选项应该是—all-databases;

三、详解利用lvm的快照来备份Mysql及其恢复

首先进行一次完全备份

[root@localhost~]# mysqldump -uroot -pmypass --lock-all-tables --all-databases --events >/backup/all_db_`date +%F`.sql
[root@localhost~]# service mysqld stop 停止Mysql服务
Shuttingdown MySQL....                                    [  OK  ]
[root@localhost~]# rm -rf /mydata/*

要求创建逻辑卷并将其挂载至/mydata下,过程不在演示

[root@localhost~]# mount
/dev/mapper/vg0-rooton / type ext4 (rw)
procon /proc type proc (rw)
sysfson /sys type sysfs (rw)
devptson /dev/pts type devpts (rw,gid=5,mode=620)
tmpfson /dev/shm type tmpfs (rw)
/dev/sda1on /boot type ext4 (rw)
/dev/mapper/vg0-usron /usr type ext4 (rw)
/dev/mapper/vg0-varon /var type ext4 (rw)
noneon /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpcon /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/mapper/myvg-mydata on /mydata type ext4 (rw)
[root@localhost~]# mkdir /mydata/data/ 在逻辑卷上创建数据目录
[root@localhost~]# chown -R mysql.mysql /mydata/data修改数据目录的权限
[root@localhost~]# cd /usr/local/mysql
[root@localhostmysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data  //初始化脚本

在配置文件中添加/etc/my.cnf

[mysqld]
port            = 3306
socket          = /tmp/mysql.sock
skip-external-locking
key_buffer_size= 256M
max_allowed_packet= 1M
table_open_cache= 256
sort_buffer_size= 1M
read_buffer_size= 1M
read_rnd_buffer_size= 4M
myisam_sort_buffer_size= 64M
thread_cache_size= 8
query_cache_size=16M
#Try number of CPU's*2 for thread_concurrency
thread_concurrency= 8
datadir=/mydata/data
sync_binlog= 1

启动mysqld服务

[root@localhost~]# service mysqld start

连到Mysql上

mysql>set session sql_log_bin=0; 关闭二进制日志
QueryOK, 0 rows affected (0.00 sec)
mysql>source /backup/all_db_2013-09-07.sql 恢复所有数据库
mysql>show databases;
+--------------------+
|Database           |
+--------------------+
|information_schema |
|catidb             |
|hailian            |
|hellodb            |
|mysql              |
|performance_schema |
|test               |
+--------------------+
7rows in set (0.00 sec)
mysql>\q
Bye

从新连到Mysql是为了开启二进制日志功能

mysql>show binary logs;
+------------------+-----------+
|Log_name         | File_size |
+------------------+-----------+
|mysql-bin.000001 |     27719 |
|mysql-bin.000002 |   1061358 |
|mysql-bin.000003 |       182 |
+------------------+-----------+
3rows in set (0.00 sec)
mysql>flush tables with read lock;
QueryOK, 0 rows affected (0.09 sec)
mysql>show master status;
+------------------+----------+--------------+------------------+
|File             | Position |Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
|mysql-bin.000003 |      182 |              |                  |
+------------------+----------+--------------+------------------+
1row in set (0.00 sec)
也可以通过[root@localhost ~]# mysql -uroot -pmypass -e 'show master status'> /backup/snapback-2
013-09-07/binlog.txt保存到binlog.txt文档中
[root@localhost~]# lvcreate -L 100M -n mydata-snap -p r -s /dev/myvg/mydata
mysql>unlock tables;
QueryOK, 0 rows affected (0.00 sec)
[root@localhost~]# cp -a /mydata/data/* /backup/snapback-2013-09-07/

之后连到mysql上有进行了一下操作

mysql>use hellodb;
Databasechanged
mysql>show tables;
+-------------------+
|Tables_in_hellodb |
+-------------------+
|classes           |
|coc               |
|courses           |
|scores            |
|students          |
|teachers          |
|toc               |
+-------------------+
7rows in set (0.00 sec)
mysql>create table testtb (id int, name char(10));
QueryOK, 0 rows affected (0.12 sec)
mysql>insert into testtb values (1,'tom');
QueryOK, 1 row affected (0.10 sec)
[root@localhost~]# mysqlbinlog --start-position=187 /mydata/data/mysql-bin.000003 >/backup/snapback-2013-09-07_incremental/incremental.sql
[root@localhost~]# service mysqld stop
[root@localhost~]# rm -rf /mydata/data/*
[root@localhost~]# cp /backup/snapback-2013-09-07/* /mydata/data/ -a
[root@localhost~]# chown -R mysql.mysql /mydata/data/*
[root@localhost~]# service mysqld start

恢复二进制日志:

mysql>set sql_log_bin=0;
mysql>source /backup/snapback-2013-09-07_incremental/incremental.sql
mysql>use hellodb;
Databasechanged
mysql>show tables;
+-------------------+
|Tables_in_hellodb |
+-------------------+
|classes           |
|coc               |
|courses           |
|scores            |
|students          |
|teachers          |
|testtb            |
|toc               |
+-------------------+
8rows in set (0.00 sec)
mysql>select * from testtb;
+------+------+
|id   | name |
+------+------+
|    1 | tom |
+------+------+
1row in set (0.00 sec)

备份恢复完成

四、详解使用Xtrabackup进行MySQL备份

为使每表单个表空间,先把所有数据备份出来,设置从新进行初始化:

[root@localhost~]# mysqldump -uroot -pmypass --lock-all-tables --all-databases --master-data=2--events > /root/alldb.sql
[root@localhost~]# cd /mydata/data/
[root@localhostdata]# rm -rf *
[root@localhostdata]# cd
[root@localhost~]# cd /usr/local/mysql/
[root@localhostmysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data/

修改配置文件/etc/my.cnf

[mysqld]
port            = 3306
socket          = /tmp/mysql.sock
skip-external-locking
key_buffer_size= 256M
max_allowed_packet= 1M
table_open_cache= 256
sort_buffer_size= 1M
read_buffer_size= 1M
read_rnd_buffer_size= 4M
myisam_sort_buffer_size= 64M
thread_cache_size= 8
query_cache_size=16M
#Try number of CPU's*2 for thread_concurrency
thread_concurrency= 8
datadir=/mydata/data    //数据目录
sync_binlog= 1                //立刻进行二进制日志同步
innodb_file_per_table = 1    //实现每表单个表空间

连到mysql上

mysql>show global variables like 'innodb_file%';
+--------------------------+----------+
|Variable_name            | Value    |
+--------------------------+----------+
|innodb_file_format       | Antelope |
|innodb_file_format_check | ON       |
|innodb_file_format_max   | Antelope |
| innodb_file_per_table   | ON       |
+--------------------------+----------+
4rows in set (0.00 sec)
mysql> source /root/alldb.sql
mysql>show databases;
+--------------------+
|Database           |
+--------------------+
|information_schema |
|catidb             |
|hailian            |
|hellodb            |
|mysql              |
|performance_schema |
|test               |
+--------------------+
7rows in set (0.00 sec)
mysql>use hellodb;
Databasechanged
mysql>show tables;
+-------------------+
|Tables_in_hellodb |
+-------------------+
|classes           |
|coc               |
|courses           |
|scores            |
|students          |
|teachers          |
|testtb            |
|toc               |
+-------------------+
8rows in set (0.00 sec)
mysql>use catidb;
Databasechanged
mysql>show tables;
+------------------+
|Tables_in_catidb |
+------------------+
|tb1              |
|tb2              |
|tb3              |
+------------------+
3rows in set (0.00 sec)
mysql>select * from hellodb.testtb;
+------+------+
|id   | name |
+------+------+
|    1 | tom |
+------+------+
1row in set (0.00 sec)

可以看到所有数据库都是每表单个表空间

[root@localhosthellodb]# ls
classes.frm  coc.ibd     db.opt      students.frm  teachers.ibd toc.frm
classes.ibd  courses.frm scores.frm  students.ibd  testtb.frm   toc.ibd
coc.frm      courses.ibd  scores.ibd teachers.frm  testtb.ibd

下载两个rpm包

percona-xtrabackup-2.1.4-656.rhel6.x86_64.rpm

percona-toolkit-2.2.4-1.noarch.rpm

进行安装为解决依赖关系用yum命令:

[root@localhost~]# yum localinstall percona-xtrabackup-2.1.4-656.rhel6.x86_64.rpm
[root@localhost~]# yum localinstall percona-toolkit-2.2.4-1.noarch.rpm –y

首先进行一次完全备份

[root@localhost~]# mkdir /innobackup  //作为备份使用目录
[root@localhost~]# innobackupex --user=root --password=mypass /innobackup/

下面是最后显示的一部分结果,需要关注的部分用红色显示

xtrabackup:Transaction log of lsn (1665573) to (1665573) wascopied.
13090821:47:22  innobackupex: All tablesunlocked
innobackupex:Backup created in directory '/innobackup/2013-09-08_21-47-18'
innobackupex:MySQL binlog position: filename 'mysql-bin.000005', position 542565
13090821:47:22  innobackupex: Connection todatabase server closed
13090821:47:22  innobackupex: completed OK!
[root@localhost~]# cd /innobackup/
[root@localhostinnobackup]# ls
2013-09-08_21-47-18
[root@localhostinnobackup]# cd 2013-09-08_21-47-18/
[root@localhost2013-09-08_21-47-18]# ls
backup-my.cnf  hailian ibdata1  performance_schema  xtrabackup_binary       xtrabackup_checkpoints
catidb         hellodb  mysql   test               xtrabackup_binlog_info xtrabackup_logfile
[root@localhost2013-09-08_21-47-18]# cat xtrabackup_checkpoints
backup_type= full-backuped
from_lsn= 0
to_lsn= 1665573
last_lsn= 1665573
compact= 0
[root@localhost2013-09-08_21-47-18]# cat xtrabackup_binlog_info //显示使用的哪个二进制日志以及位置
mysql-bin.000005 542565

进行一次完全备份后连到Mysql上,做了一些修改

mysql>show tables;
+-------------------+
|Tables_in_hellodb |
+-------------------+
|classes           |
|coc               |
|courses           |
|scores            |
|students          |
|teachers          |
|testtb            |
|toc               |
+-------------------+
8rows in set (0.00 sec)
mysql>select * from students;
+-------+---------------+-----+--------+---------+-----------+
|StuID | Name          | Age | Gender |ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu   |  22| M      |       2 |         3 |
|     2 | Shi Potian    |  22| M      |       1 |         7 |
|     3 | Xie Yanke     | 53 | M      |       2 |        16 |
|     4 | Ding Dian     | 32 | M      |       4 |         4 |
|     5 | Yu Yutong     | 26 | M      |       3 |         1 |
|     6 | Shi Qing      | 46 | M      |       5 |     NULL |
|     7 | Xi Ren        | 19 | F      |       3 |     NULL |
|     8 | Lin Daiyu     | 17 | F      |       7 |     NULL |
|     9 | Ren Yingying  |  20 |F      |       6 |     NULL |
|    10 | Yue Lingshan  |  19 |F      |       3 |     NULL |
|    11 | Yuan Chengzhi |  23 | M     |       6 |      NULL |
|    12 | Wen Qingqing  |  19 |F      |       1 |     NULL |
|    13 | Tian Boguang  |  33 |M      |       2 |     NULL |
|    14 | Lu Wushuang   |  17| F      |       3 |     NULL |
|    15 | Duan Yu       | 19 | M      |       4 |     NULL |
|    16 | Xu Zhu        | 21 | M      |       1 |     NULL |
|    17 | Lin Chong     | 25 | M      |       4 |     NULL |
|    18 | Hua Rong      | 23 | M      |       7 |     NULL |
|    19 | Xue Baochai   |  18| F      |       6 |     NULL |
|    20 | Diao Chan     | 19 | F      |       7 |     NULL |
|    21 |Huang Yueying |  22 | F      |      6 |      NULL |
|    22 | Xiao Qiao     | 20 | F      |       1 |     NULL |
|    23 | Ma Chao       | 23 | M      |       4 |     NULL |
|    24 | Xu Xian       | 27 | M      |    NULL |     NULL |
|    25 | Sun Dasheng   | 100 | M      |   NULL |      NULL |
+-------+---------------+-----+--------+---------+-----------+
25rows in set (0.00 sec)
mysql>delete from students where stuid >= 24;
QueryOK, 2 rows affected (0.01 sec)
mysql>\q

注意:如果有增量时只能提交事务,不能回滚事务

使用innobackupex进行增量备份

进行第一次增量备份

--incremental 明确说明进行增量备份的存放位置,--incremental-basedir表示增量相对的文件

[root@localhost~]# innobackupex --user=root --password=mypass --incremental /innobackup/--incremental-basedir=/innobackup/2013-09-08_21-47-18/
[root@localhost~]# cd /innobackup/
[root@localhostinnobackup]# ls
2013-09-08_21-47-18  2013-09-09_00-30-21
[root@localhostinnobackup]# cd 2013-09-09_00-30-21/
[root@localhost2013-09-09_00-30-21]# ls
backup-my.cnf  ibdata1.meta        xtrabackup_binlog_info
catidb         mysql               xtrabackup_checkpoints
hailian        performance_schema  xtrabackup_logfile
hellodb        test
ibdata1.delta  xtrabackup_binary
[root@localhost2013-09-09_00-30-21]# cat xtrabackup_checkpoints
backup_type= incremental
from_lsn= 1665573
to_lsn= 1666830
last_lsn= 1666830
compact= 0

连到Mysql上进行第二次修改操作

mysql>use hellodb;
Databasechanged
mysql>show tables-> ;
+-------------------+
|Tables_in_hellodb |
+-------------------+
|classes           |
|coc               |
|courses           |
|scores            |
|students          |
|teachers          |
|testtb            |
|toc               |
+-------------------+
8rows in set (0.00 sec)
mysql>desc students;
+-----------+---------------------+------+-----+---------+----------------+
|Field     | Type                | Null | Key | Default |Extra          |
+-----------+---------------------+------+-----+---------+----------------+
|StuID     | int(10) unsigned    | NO  | PRI | NULL    | auto_increment |
|Name      | varchar(50)         | NO  |     | NULL    |                |
|Age       | tinyint(3) unsigned | NO   |    | NULL    |                |
|Gender    | enum('F','M')       | NO  |     | NULL    |                |
|ClassID   | tinyint(3) unsigned |YES  |    | NULL    |                |
|TeacherID | int(10) unsigned    |YES  |    | NULL    |                |
+-----------+---------------------+------+-----+---------+----------------+
6rows in set (0.00 sec)
mysql>insert into students (Name,Age,Gender,ClassID,TeacherID) values('tom',33,'M',2,4);
QueryOK, 1 row affected (0.01 sec)

进行第二次增量备份

[root@localhost~]# innobackupex --user=root --password=mypass --incremental /innobackup/ --incremental-basedir=/innobackup/2013-09-09_00-30-21/

注意:第二次增量备份是相对于第一次增量备份而言的,主要是—incremental-basedir的路径

第二次增量备份之后连到Mysql上又进行了一些修改

mysql>use hellodb;
Databasechanged
mysql>show tables;
+-------------------+
|Tables_in_hellodb |
+-------------------+
|classes           |
|coc               |
|courses           |
|scores            |
|students          |
|teachers          |
|testtb            |
|toc               |
+-------------------+
8rows in set (0.00 sec)
mysql>select * from coc;
+----+---------+----------+
|ID | ClassID | CourseID |
+----+---------+----------+
|  1 |      1 |        2 |
|  2 |      1 |        5 |
|  3 |      2 |        2 |
|  4 |      2 |        6 |
|  5 |      3 |        1 |
|  6 |      3 |        7 |
|  7 |      4 |        5 |
|  8 |      4 |        2 |
|  9 |      5 |        1 |
|10 |       5 |        9 |
|11 |       6 |        3 |
|12 |       6 |        4 |
|13 |       7 |        4 |
|14 |       7 |        3 |
+----+---------+----------+
14rows in set (0.00 sec)
mysql>delete from coc where id=14;
QueryOK, 1 row affected (0.01 sec)
mysql>\q

把二进制日志复制出来,模拟mysql服务崩溃

[root@localhost~]# cd /mydata/data/
[root@localhostdata]# ls
catidb       localhost.localdomain.err  mysql-bin.000004
hailian      localhost.localdomain.pid  mysql-bin.000005
hellodb      mysql                      mysql-bin.index
ibdata1      mysql-bin.000001           performance_schema
ib_logfile0  mysql-bin.000002           test
ib_logfile1  mysql-bin.000003
[root@localhostdata]# cp mysql-bin.00000[1-5] /tmp/
[root@localhostdata]# service mysqld stop
Shuttingdown MySQL.                                       [  OK  ]
[root@localhostdata]# rm -rf *

对二进制日志进行备份:

[root@localhostdata]# cd /innobackup/
[root@localhostinnobackup]# ls
2013-09-08_21-47-18  2013-09-09_00-30-21  2013-09-09_00-40-47
[root@localhostinnobackup]# cd 2013-09-09_00-40-47/
[root@localhost2013-09-09_00-40-47]# ls
backup-my.cnf  ibdata1.meta        xtrabackup_binlog_info
catidb         mysql               xtrabackup_checkpoints
hailian        performance_schema  xtrabackup_logfile
hellodb        test
ibdata1.delta  xtrabackup_binary
[root@localhost2013-09-09_00-40-47]# cat xtrabackup_binlog_info
mysql-bin.000005 543041
[root@localhost~]# cd /tmp/
[root@localhosttmp]# mysqlbinlog --start-position=543041 mysql-bin.000005 > ./all.sql

恢复前的准备工作:

[root@localhost~]# innobackupex --apply-log --redo-only /innobackup/2013-09-08_21-47-18/[root@localhost ~]# innobackupex --apply-log--redo-only /innobackup/2013-09-08_21-47-18/ --incremental-dir=/innobackup/2013-09-09_00-30-21/[root@localhost ~]# innobackupex --apply-log--redo-only /innobackup/2013-09-08_21-47-18/--incremental-dir=/innobackup/2013-09-09_00-40-47/

进行恢复操作

[root@localhost~]# innobackupex --copy-back /innobackup/2013-09-08_21-47-18/
[root@localhost~]# cd /mydata/data/
[root@localhostdata]# chown -R mysql.mysql *
[root@localhostdata]# ll
total18456
drwxr-xr-x2 mysql mysql     4096 Sep  9 01:22 catidb
drwxr-xr-x2 mysql mysql     4096 Sep  9 01:22 hailian
drwxr-xr-x2 mysql mysql     4096 Sep  9 01:22 hellodb
-rw-r--r--1 mysql mysql 18874368 Sep  9 01:22ibdata1
drwxr-xr-x2 mysql mysql     4096 Sep  9 01:22 mysql
drwxr-xr-x2 mysql mysql     4096 Sep  9 01:22 performance_schema
drwxr-xr-x2 mysql mysql     4096 Sep  9 01:22 test
[root@localhostdata]# service mysqld start
mysql>use hellodb;
Databasechanged
mysql>select * from students;
+-------+---------------+-----+--------+---------+-----------+
|StuID | Name          | Age | Gender |ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu   |  22| M      |       2 |         3 |
|     2 | Shi Potian    |  22| M      |       1 |         7 |
|     3 | Xie Yanke     | 53 | M      |       2 |        16 |
|     4 | Ding Dian     | 32 | M      |       4 |        4 |
|     5 | Yu Yutong     | 26 | M      |       3 |         1 |
|     6 | Shi Qing      | 46 | M      |       5 |     NULL |
|     7 | Xi Ren        | 19 | F      |       3 |     NULL |
|     8 | Lin Daiyu     | 17 | F      |       7 |     NULL |
|     9 | Ren Yingying  |  20 |F      |       6 |     NULL |
|    10 | Yue Lingshan  |  19 |F      |       3 |     NULL |
|    11 | Yuan Chengzhi |  23 | M     |       6 |      NULL |
|    12 | Wen Qingqing  |  19 |F      |       1 |     NULL |
|    13 | Tian Boguang  |  33 |M      |       2 |     NULL |
|    14 | Lu Wushuang   |  17| F      |       3 |     NULL |
|    15 | Duan Yu       | 19 | M      |       4 |     NULL |
|    16 |Xu Zhu        |  21 | M     |       1 |      NULL |
|    17 | Lin Chong     | 25 | M      |       4 |     NULL |
|    18 | Hua Rong      | 23 | M      |       7 |     NULL |
|    19 | Xue Baochai   |  18| F      |       6 |     NULL |
|    20 | Diao Chan     | 19 | F      |       7 |     NULL |
|    21 | Huang Yueying |  22 | F     |       6 |      NULL |
|    22 | Xiao Qiao     | 20 | F      |       1 |     NULL |
|    23 | Ma Chao       | 23 | M      |       4 |     NULL |
|    26 | tom           | 33 | M      |       2 |         4 |
+-------+---------------+-----+--------+---------+-----------+
24rows in set (0.00 sec)
mysql>select * from coc;
+----+---------+----------+
|ID | ClassID | CourseID |
+----+---------+----------+
|  1 |      1 |        2 |
|  2 |      1 |        5 |
|  3 |      2 |        2 |
|  4 |      2 |        6 |
|  5 |      3 |        1 |
|  6 |      3 |        7 |
|  7 |      4 |        5 |
|  8 |      4 |        2 |
|  9 |      5 |        1 |
|10 |       5 |        9 |
|11 |       6 |        3 |
|12 |       6 |        4 |
|13 |       7 |        4 |
|14 |       7 |        3 |
+----+---------+----------+
14rows in set (0.00 sec)
mysql>set sql_log_bin=0;
QueryOK, 0 rows affected (0.00 sec)
mysql>source /tmp/all.sql;
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
Charsetchanged
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
Databasechanged
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 1 row affected (0.00 sec)
QueryOK, 0 rows affected (0.01 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
mysql>select * from coc;
+----+---------+----------+
|ID | ClassID | CourseID |
+----+---------+----------+
|  1 |      1 |        2 |
|  2 |      1 |        5 |
|  3 |      2 |        2 |
|  4 |      2 |        6 |
|  5 |      3 |        1 |
|  6 |      3 |        7 |
|  7 |      4 |        5 |
|  8 |      4 |        2 |
|  9 |      5 |        1 |
|10 |       5 |        9 |
|11 |       6 |        3 |
|12 |       6 |        4 |
|13 |       7 |        4 |
+----+---------+----------+
13rows in set (0.00 sec)

恢复操作完成

详解mysql备份恢复的三种实现方式相关推荐

  1. mysql临键锁_详解 MySql InnoDB 中的三种行锁(记录锁、间隙锁与临键锁)

    详解 MySql InnoDB 中的三种行锁(记录锁.间隙锁与临键锁) 前言 InnoDB 通过 MVCC 和 NEXT-KEY Locks,解决了在可重复读的事务隔离级别下出现幻读的问题.MVCC  ...

  2. python可以播放音乐吗_详解python播放音频的三种方法

    第一种 使用pygame模块 pygame.mixer.init() pygame.mixer.music.load(self.wav_file) pygame.mixer.music.set_vol ...

  3. python如何安装matplotlib_详解python安装matplotlib库三种失败情况

    (可能只有最后一句命令有用,可能全篇都没用) (小白方法,可能只适用于本人情况) 安装matplotlib时,出现的三种失败情况 1.read timed out 一开始我在pycharm终端使用pi ...

  4. python调用cmd命令释放端口_详解python调用cmd命令三种方法

    目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...

  5. 详解MySQL双活同步复制四种解决方案

    详解MySQL双活同步复制四种解决方案 参考文章: (1)详解MySQL双活同步复制四种解决方案 (2)https://www.cnblogs.com/wuchangsoft/p/10390552.h ...

  6. html正方形边框,详解HTML设置边框的三种方式

    HTML设置边框的三种方式 border-width: 1px 2px 2px; border-style: solid dashed dotted; border-color:red green b ...

  7. java 数组合并_拼接_详解Java合并数组的两种实现方式

    详解Java合并数组的两种实现方式 发布于 2020-7-27| 复制链接 摘记: 最近在写代码时遇到了需要合并两个数组的需求,突然发现以前没用过,于是研究了一下合并数组的方式,总结如下.1.Syst ...

  8. python操作数据库的几种方法_python对mysql数据库操作的三种不同方式

    原标题:python对mysql数据库操作的三种不同方式 |转载自:博客园 |原文链接:http://www.cnblogs.com/mryrs/p/6951008.html 先要说一下,在这个暑期如 ...

  9. java全局异常处理_详解Spring全局异常处理的三种方式

    在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作 ...

最新文章

  1. pandas判断日期是否是闰年(is_leap_year)实战: 数据列转化为日期(时间)格式、判断pandas的日期数据列是否是闰年
  2. 《Performance Overhead of Atomic Crosschain Transactions》
  3. XCTF easyCpp buu [MRCTF2020]EasyCpp
  4. DynamipsGUI
  5. 【转】HashMap集合中key只能为引用数据类型,不能为基本类型
  6. 【Finish】Python Day 2
  7. 无监督学习 k-means_无监督学习-第2部分
  8. 架构设计中的方法学(七)
  9. 蓝桥杯第八届省赛JAVA真题----字母组串
  10. Luogu P4774 / LOJ2721 【[NOI2018]屠龙勇士】
  11. 【状压dp】AC Challenge
  12. 分布式事务一致性方案
  13. python关闭word_python自动化办公:玩转word之样式秘笈
  14. 五一建模之二维纸板切割问题线性整数规划问题
  15. 使用暴风激活激活系统,浏览器被劫持问题解决
  16. jadx工具介绍及使用
  17. 发布文章的php模板,PHP实现发送模板消息(微信公众号版)
  18. JSP项目进度管理系统myeclipse开发sql数据库BS模式java编程网页结构
  19. Gulp 编译Less和Sass
  20. Windows下搭建ant+jenkins+jmeter自动化接口测试框架(详细篇)

热门文章

  1. iuap 助力国贸股份打造数字化风控平台
  2. Batch和Epoch之间的区别是什么?
  3. 【JavaScript】网页轮播图
  4. 研究了下maphack,顺便做了个1.22版的
  5. SAP那些事-职业篇-10-顾问最重要的思维方式
  6. Ubuntu 16.04 一系列软件安装命令,包括QQ、搜狗、Chrome、vlc、网易云音乐安装方法...
  7. 1.初识C语言----什么是C语言,为什么要学C语言?
  8. 二.ARM裸机学习之S5PV210刷机
  9. linux kernel内核编程基础总结
  10. nyoj1238 最少换乘 最短路