MySQL备份和还原

1.备份类型
html

根据备份时服务器是否可以向外继续提供服务分为:热备份、温备份、冷备份。mysql

    热备份:在线,读、写不受影响;sql

    温备份:在线,但仅能够执行读操做;数据库

    冷备份:离线,读、写操做均不能进行;bash

根据备份时是直接复制数据文件仍是将数据导出进行备份分为:物理备份、逻辑备份。服务器

    物理备份:直接复制数据文件;app

    逻辑备份:将数据导出至文本文件当中;ide

根据备分内容不一样分为:彻底备份、增量备份、差别备份。函数

    彻底备份:备份所有数据;工具

    增量备份:仅备份上次彻底备份或增量备份之后变化的数据;

    差别备份:仅备份上次彻底备份以来变化的数据;

2.使用mysqldump工具有份还原数据

    mysqldump是一个逻辑备份工具,对MyISAM引擎能够实现温备,对InnoDB引擎能够实现热备。速度比较慢,不适合对大数据库进行彻底备份。数据还原时应该将二进制日志功能临时性关掉(sql_log_bin=OFF),还原后在启用。

    mysqldump命令的用法及其常见选项:

mysqldump -uroot -p [db_name] [tb1] [tb2] > backfile    #备份单个数据库,或库中特定表
    --master-data={0|1|2}
        0: 不记录二进制日志文件及其位置;
        1:以CHNAGE MASTER TO的方式记录位置,可用于恢复后直接启动从服务器;
        2:以CHANGE MASTER TO的方式记录位置,但默认为被注释;
    --lock-all-tables:锁定全部表
    --flush-logs:执行日志滚动
    --all-databases:备份全部库
    --databases DB_NAME,DB_NAME,...:备份指定库
    --events:备份事件
    --routines:备份存储过程和存储函数
    --triggers:备份触发器
    --no-data:只备份表结构
    若是指定库中的表类型均为InnoDB,可以使用--single-transaction启动热备;

    mysqldump彻底备份加二进制日志增量备份及还原实例:

备份:

mysqldump -uroot -p --master-data=2 --flush-logs --all-databases --lock-all-tables > /root/all.sql
    #彻底备份
mysqlbinlog mysql-bin.000011 > /root/first-incremental.sql
    #第一次增量备份

删除数据文件模拟故障还原(假设故障时使用的二进制日志文件为mysql-bin.000012且二进制日志文件和数据文件分开存储):

killall mysqld
/usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mydata/data
    #初始化数据库
service mysqld start
mysql -uroot -p < /root/all.sql
    #还原彻底备份
mysql -uroot -p < /root/first-incremental.sql
    #还原增量备份
mysqlbinlog mysql-bin.000012 > /tmp/tmp.sql
mysql -uroot -p < /tmp/tmp.sql
    #即时点恢复

3.经过select命令备份数据并还原

    select一般用来备份单个表,还原时表结构须要预先建立好。

备份:

mysql> SELECT * INTO OUTFILE '/path/to/somefile.txt' FROM tb_name [WHERE clause];

还原:

mysql> LOAD DATA INFILE '/path/to/somefile.txt' INTO TABLE tb_name;

4.使用LVM快照进行数据库备份

    LVM快照可以实现几乎热备,使用LVM快照备份须要注意如下几点:

        一、数据文件要在逻辑卷上;
        二、此逻辑卷所在卷组必须有足够空间使用快照卷;
        三、数据文件和事务日志要在同一个逻辑卷上;

备份:

    刷新表并施加读锁:

mysql> FLUSH TABLES WITH READ LOCK;
mysql> FLUSH LOGS;

    经过另外一个终端保存二进制日志文件及相关位置信息:

mysql -uroot -p -e 'SHOW MASTER STATUS\G' > /path/to/master.info

    建立快照卷:

lvcreate -L 1G -s -p r -n mydata-snap /dev/myvg/mydata

    释放锁:

mysql> UNLOCK TABLES;

    挂在快照卷并备份数据:

mount -o ro  /dev/myvg/mydata-snap /mnt
cp -a /mnt/* /backup

    删除快照卷:

umount /mnt
lvremove --force /dev/myvg/mydata-snap

还原:

cp -a /backup/* /mydata/data

6.使用xtrabackup进行数据库备份

1).xtrabackup进行彻底备份与恢复

a. xtrabackup进行彻底备份

innobackupex --user=DBUSER --password=DBUSERPASS  /path/to/BACKUP-DIR/
    #/path/to/BACKUP-DIR/表示备份文件保存的位置
    #innobackupex命令封装了支持各类不一样MySQL版本的xtrabackup工具

    在备份的同时,innobackupex还会在备份目录中建立以下文件:
    (1)xtrabackup_checkpoints —— 备份类型(如彻底或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;
    注:每一个InnoDB页(一般为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每一个页面相关的LSN可以代表此页面最近是如何发生改变的。
    (2)xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置;
    (3)xtrabackup_binlog_pos_innodb —— 二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position;
    (4)xtrabackup_binary —— 备份中用到的xtrabackup的可执行文件;
    (5)backup-my.cnf —— 备份命令用到的配置选项信息;

b. 准备(prepare)一个彻底备份
    通常状况下,在备份完成后,数据尚且不能用于恢复操做,由于备份的数据中可能会包含还没有提交的事务或已经提交但还没有同步至数据文件中的事务。所以,此时数据文件仍处于不一致状态。“准备”的主要做用正是经过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。

innobackupex --apply-log  /path/to/BACKUP-DIR

c. 从一个彻底备份中恢复数据

innobackupex --copy-back  /path/to/BACKUP-DIR

    当数据恢复至DATADIR目录之后,还须要确保全部数据文件的属主和属组均为正确的用户,如mysql,不然,在启动mysqld以前还须要事先修改数据文件的属主和属组。如:

# chown -R  mysql:mysql  /mydata/data/

2).xtrabackup进行增量备份并还原

a. 进行增量备份

innobackupex --incremental /backup --incremental-basedir=BASEDIR
    #/backup表示增量备份文件保存的位置
    #--incremental-basedir指定彻底备份所在的目录或上一次增量备份所在目录

注:增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是彻底备份。

b. 准备(prepare)增量备份

    “准备”(prepare)增量备份与整理彻底备份有着一些不一样,尤为要注意的是:

    (1)须要在每一个备份(包括彻底和各个增量备份)上,将已经提交的事务进行“重放”。“重放”以后,全部的备份数据将合并到彻底备份上。

    (2)基于全部的备份将未提交的事务进行“回滚”。

innobackupex --apply-log --redo-only BASE-DIR
    #--redo-only表示跳过rollback阶段,只进行redo阶段
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2

    其中BASE-DIR指的是彻底备份所在的目录,而INCREMENTAL-DIR-1指的是第一次增量备份的目录,INCREMENTAL-DIR-2指的是第二次增量备份的目录,其它依次类推,即若是有屡次增量备份,每一次都要执行如上操做。

c. 还原数据

    由于准备阶段已经将全部数据所有合并到彻底备份上,全部还原时只需还原彻底备份便可。

innobackupex --copy-back  BASE-DIR
chown -R  mysql:mysql  /mydata/data/

参考资料:

MySQL数据备份与恢复:http://www.cnblogs.com/wenanry/archive/2010/05/18/1737939.html

相关文章
相关标签/搜索