一、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 //禁用�Copt选项.
--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 �Cy
首先进行一次完全备份
[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的三种备份工作原理,多操作归纳总结是非常必要的,不足之处多多指点!