使用Xtrabackup来实现mysql数据库的备份和恢复

一.Xtrabackup概述:
      Xtrabackup是由percona提供的mysql数据库备份工具,支持在线热备份.据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具,同时也支持mariadb.下载Xtrabackup,需要下载相应数据库版本和相应系统的rpm包或源代码,个人认为,rpm包安装完全可以解决问题,就没必要用源码编译安装了.
      Xtrabackup有两个主要的工具:xtrabackup、innobackupex[个人推荐使用此方式]
   注解:
    (1).xtrabackup只能备份InnoDB和XtraDB 两种数据表
    (2).innobackupex则封装了xtrabackup,同时可以备份MyISAM数据表
    Innobackupex完整备份后生成了几个重要的文件:
     xtrabackup_binlog_info:记录当前最新的LOG Position
     xtrabackup_binlog_pos_innodb:innodb log postion
     xtrabackup_checkpoints: 存放备份的起始位置beginlsn和结束位置endlsn,增量备份需要这个lsn[增量备份可以在这里面看from和to两个值的变化]
二.Xtrabackup特点:
    (1)备份过程快速、可靠
    (2)备份过程不会打断正在执行的事务
    (3)能够基于压缩等功能节约磁盘空间和流量
    (4)自动实现备份检验
    (5)还原速度快
三.Xtrabackup的安装:
    percona官方网站:http://www.percona.com/downloads/   请到此网站下载对应数据库版本的源码包或RPM包
   [root@client103 ~]# rpm -ivh percona-xtrabackup-20-2.0.8-587.rhel6.x86_64.rpm
四.innobackupex相关参数说明:
   注:xtrabackup命令只备份数据文件,并不备份数据表结构(.frm),所以使用xtrabackup恢复的时候,你必须有对应表结构文件(.frm),所以,个人推荐采用innobackupex命令[此命令相当于冷备份,复制数据目录的索引,数据,结构文件,但会有短暂的锁表(时间依赖于MyISAM大小)]
参数说明如下:
    –defaults-file:指定my.cnf参数文件的位置[此配置文件里必须指定datadir]
    –apply-log:同xtrabackup的–prepare参数,一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据 文件仍处理不一致状态。–apply-log的作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态。
    –copy-back:做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir
    –remote-host=HOSTNAME: 通过ssh将备份数据存储到进程服务器上
    –stream=[tar]:备份文件输出格式, 该文件可在XtarBackup binary文件中获得. 在使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话,xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数–tmpdir指定目录来解决这个问题.
    –tmpdir=DIRECTORY:当有指定–remote-host or –stream时, 事务日志临时存储的目录, 默认采用MySQL配置文件中所指定的临时目录tmpdir
    –redo-only –apply-log:强制备份日志时只redo,跳过rollback,这在做增量备份时非常必要
    –use-memory=*:该参数在prepare的时候使用,控制prepare时innodb实例使用的内存
    –databases=LIST:列出需要备份的databases,如果没有指定该参数,所有包含MyISAM和InnoDB表的database都会被备份
    –slave-info:备份从库, 加上–slave-info备份目录下会多生成一个xtrabackup_slave_info 文件, 这里会保存主日志文件以及偏移, 文件内容类似于:CHANGE MASTER TO MASTER_LOG_FILE=”, MASTER_LOG_POS=0
    –socket=SOCKET:指定mysql.sock所在位置,以便备份进程登录mysql.
五.使用innobackupex命令来实现数据库备份:

1.完全备份与恢复:

  1. # 指定备份某一数据库  
  2. [root@client103 ~]# innobackupex –user=root –password=kongzhong –defaults-file=/etc/my.cnf –port=3306 –databases=a /tmp/backup/ >/tmp/backup/innoback.log 2>&1  
  3. # 备份所有的数据库  
  4. [root@client103 backup]# innobackupex –user=root –password=kongzhong –defaults-file=/etc/my.cnf –port=3306  /tmp/backup/ >/tmp/backup/innoback.log 2>&1  
  5. # 注:还原时,需要清空数据目录,所以建议备份的话,执行全库备份  
  6. # 备份完成后,应用日志,是备份的数据保持一致[ /tmp/backup/2014-01-11_14-46-21/:为备份存放的位置]  
  7. [root@client103 ~]# innobackupex –apply-log /tmp/backup/2014-01-11_14-46-21/   
  8. # 利用刚才的备份进行数据库还原  
  9. [root@client103 ~]# innobackupex –copy-back /tmp/backup/2014-01-11_14-46-21/   
  10. ### 备份到远程机器上[这里的ssh的话,需要实现两边的key同步,不需要输入密码,否则无法实现,此方法一般应该不用,待检验] ###  
  11. [root@client103 ~]# innobackupex –user=root –password=kongzhong –defaults-file=/etc/my.cnf –port=3306  –databases=a –stream=tar /tmp/backup/ |ssh root@192.168.1.100 cat “>”/tmp/backup  

2.增量备份与恢复:

  1. # 全备  
  2. [root@client103 ~]# innobackupex –user=root –password=kongzhong –defaults-file=/etc/my.cnf –port=3306  /tmp/backup/ >/tmp/backup/innoback.log 2>&1  
  3. # 基于全备的增量备份  
  4. [root@client103 ~]# innobackupex –user=root –password=kongzhong –defaults-file=/etc/my.cnf –port=3306 –incremental –incremental-basedir=/tmp/backup/全备的文件名/ /tmp/backup/  
  5. # 基于增量备份的增量备份  
  6. [root@client103 ~]# innobackupex –user=root –password=kongzhong –defaults-file=/etc/my.cnf –port=3306 –incremental –incremental-basedir=/tmp/backup/增量备份的文件名/ /tmp/backup/  
  7. # 备份应用日志,保证数据一致  
  8. # 全备应用日志  
  9. [root@client103 ~]# innobackupex  –apply-log /tmp/backup/2014-01-11_15-37-31/  
  10. # 第一次的增量备份应用日志,应用完日志后,将合并到全备上,恢复使用全备恢复  
  11. [root@client103 ~]# innobackupex  –apply-log /tmp/backup/2014-01-11_15-37-31/ –incremental-dir=/tmp/backup/2014-01-11_15-45-06/  
  12. # 将第二次增量备份应用日志并合并到全备上  
  13. [root@client103 ~]# innobackupex  –apply-log /tmp/backup/2014-01-11_15-37-31/ –incremental-dir=/tmp/backup/2014-01-11_15-46-33/  
  14. # 此时两次增量备份其实都合并到全备上了,恢复是只需要使用全备进行恢复就可以了  
  15. # 模拟数据故障[删除数据库的数据目录,执行如下命令还原]  
  16. [root@client103 ~]# innobackupex –copy-back /tmp/backup/2014-01-11_15-37-31/  
  17. # 恢复后的数据默认权限是有问题的,所以需要修改数据目录权限,如下  
  18. [root@client103 ~]# chown -R mysql:mysql /var/lib/mysql/  
  19. # 此时数据恢复完成,重启数据库服务,进行测试就可以了。大家自行测试,有问题留言反馈!  
3.简述备份和恢复的步骤:
(1).备份:
    a.全备
    b.基于全备的多次增量备份
(2).恢复:
    a.全备
    b.基于全备的多次增量备份
    c.全备应用日志,保证数据一致
    d.合并多次增量备份到全备上
    e.利用全备恢复数据
    f.恢复完成后,修改数据目录的权限
    g.重启mysql服务

RMAN 备份和恢复

在归档模式下:

1.rman登陆,备份全库

     $rman target /
     RMAN>backup database;             # DBID=1180863394,数据库唯一标识号

1).丢失所有数据文件下的恢复:

       $rm *.dbf         # 模拟丢失所有数据文件
       RMAN>shutdown abort
       $rman target /
       RMAN>startup mount;         # 在RMAN下,启动数据库到mount状态
       RMAN>restore database;      # 还原数据库[RMAN自动根据备份还原数据库]
       RMAN>recover database;      # 恢复数据库[应用归档日志的过程]
       RMAN>alter database open;

2).在数据库关闭的情况下,丢失一个数据文件:

       $rman target /
       RMAN>backup as backupset database;    # 备份数据库,以备份集的方式
       $rm user01.dbf                # 模拟一个数据文件丢失
       $rman target /
       RMAN>shutdown abort
       RMAN>startup mount;           # 登陆RMAN,数据库启动到mount状态
       RMAN>restore datafile xx;     # 还原数据文件[xx 代表数据文件的编号]
       RMAN>recover datafile xx;     # 恢复数据文件
       RMAN>alter database open;

3).在数据库open的情况下,丢失一个数据文件:

       RMAN>sql 'alter tablespace ts_name offline immediate';   # 让丢失的那个数据文件脱机
       RMAN>restore tablespace ts_name;         # 还原数据文件
       RMAN>recover tablespace ts_name;         # 恢复数据文件
       RMAN>sql 'alter tablespace ts_name online';   # 使数据文件联机

4).系统表空间数据文件丢失:

        $rm system file
        shutdown abort            # 模拟系统表空间数据文件丢失
        RMAN>startup mount        # 启动到mount状态
        RMAN>restore datafile 1;  # 还原数据文件
        RMAN>recover datafile 1;  # 恢复数据文件
        RMAN>alter database open;

5).丢失UNDO表空间数据文件:

        rm undo file
        shutdown abort;        # 模拟undo数据文件丢失
        rman tartget /
        RMAN>startup mount;    # 登陆RMAN,启动到mount状态
        RMAN>report schema;    # 显示所有数据文件对象
        RMAN>restore datafile x;  # 还原指定数据文件[这里特指UNDO]
        RMAN>recover datafile x;  # 恢复指定数据文件
        RMAN>alter database open;

6).数据文件丢失,还原数据文件到一个新的位置:

       alter tablespace users offline immediate;
       or alter database datafile x offline;          # 使用上面两种方法,使数据文件脱机
       RMAN> run{
             set newname for datafile '/u01/app/oracle/oradata/orcl/DATA_TS01.DBF'
             to '/u02/app/oracle/oradata/orcl/DATA_TS01.DBF';    # 将旧文件制定到新的地点
             restore datafile 6;   # 还原数据文件
             switch datafile 6;    # 数据文件切换[此步很重要,移动要做]
             recover datafile 6;   # 恢复数据文件
             }                         
       RMAN>sql 'alter tablespace users online';  # 联机

7).恢复数据库到一台新的主机[可以算是迁移数据库]

前期准备:
A.记录源数据库的DBID[这里很重要,必须记录]
B.复制源数据库参数文件到新的主机相应的目录[…./dbs/….]
C.确认源数据库有备份,包括控制文件[建议,开启自动备份 CONFIGURE CONTROLFILE AUTOBACKUP on],方便新的主机访问

还原数据库到新的主机:[在新主机上操作]

(1).$ setenv ORACLE_SID orcl # 设置实例[原数据库的实例名]

(2).$ rman TARGET / # 登陆RMAN

(3).RMAN> SET DBID 1090770270; # DBID设置为源数据库的DBID,可以在源数据库上,通过V$DATABASE视图查询

(4).RMAN> STARTUP NOMOUNT; # 启动数据库到nomount状态 [这里会报下面的错]

startup failed: ORA-01078: failure in processing system parameters

(5).还原参数文件

      RMAN>RUN
          {
           RESTORE SPFILE FROM AUTOBACKUP;    # 还原参数文件,关闭数据库
           SHUTDOWN ABORT;
          }

(6).修改参数文件,相应文件的位置[这里建议新机器的路径和目前机器的路径一致]

(7).RMAN> STARTUP NOMOUNT ; # 用新的参数文件启动到nomount状态

(8).还原控制文件

      RUN
       {
         RESTORE CONTROLFILE FROM AUTOBACKUP;
         ALTER DATABASE MOUNT;
       }

(9).还原数据文件和日志文件

            RUN
               {  # 重命名相关数据文件,日志文件
                SET NEWNAME FOR DATAFILE 1 TO '?/oradata/test/system01.dbf';
                SET NEWNAME FOR DATAFILE 2 TO '?/oradata/test/undotbs01.dbf';
                SET NEWNAME FOR DATAFILE 3 TO '?/oradata/test/sysaux.dbf';
                SET NEWNAME FOR DATAFILE 4 TO '?/oradata/test/users01.dbf';
                SET NEWNAME FOR DATAFILE 5 TO '?/oradata/test/example01.dbf';
                SQL "ALTER DATABASE RENAME FILE ''/u01/app/oracle/oradata/orcl/redo01.log''
                  TO ''?/oradata/test/redo01.log'' ";
                SQL "ALTER DATABASE RENAME FILE ''/u01/app/oracle/oradata/orcl/redo02.log''
                 TO ''?/oradata/test/redo02.log'' ";
                SQL "ALTER DATABASE RENAME FILE ''/u01/app/oracle/oradata/orcl/redo03.log''
                TO ''?/oradata/test/redo03.log'' ";
                RESTORE DATABASE;
                SWITCH DATAFILE ALL;    # 数据文件切换[重要]
                RECOVER DATABASE;
               }

(10).以RESETLOGS方式打开数据库:

RMAN> ALTER DATABASE OPEN RESETLOGS;

2.备份相关视图
v$backup_files
v$backup_datafile
v$backup_set
v$backup_piece
v$backup_redolog
v$backup_spfile
v$backup_device
v$rman_configuration
v$copy_corruption

oracle基于用户管理的备份、恢复[非归档模式]

1.oracle备份的分类:物理备份[备份数据文件/控制文件等]和逻辑备份[导入导出数据]

2

2.物理备份分为:基于 用户管理的备份第三方备份工具 oracle提供的工具(rman)    ==> rman是基于块的备份,可以做增量备份

3.oracle的冷备份 [又称脱机备份,完全备份,一致备份]

(1).冷备份的概念:
数据库在关闭状态下完成所有物理系统文件拷贝的过程,也称脱机备份
适合于非归档模式下,数据库处于一致性状态

(2).备份思想:
a.查询所有的物理文件位置,关闭数据库(shutdown)
b.复制物理文件到指定的备份目录
c.启动数据库

(3).备份的步骤

a.检查数据库是否在非归档模式:

  1. SYS> archive log list  
  2. Database log mode No Archive Mode # 表明在非归档模式  
  3. Automatic archival Disabled  
  4. Archive destination USE_DB_RECOVERY_FILE_DEST  
  5. Oldest online log sequence 17  
  6. Current log sequence 19  
  7. 或  
  8. SYS> select log_mode from V$database;  
  9. LOG_MODE  
  10. ————  
  11. NOARCHIVELOG # 表明在非归档模式  

b.查看需要备份文件的位置[包括数据文件,控制文件,日志文件,临时文件(可选)]

查看数据文件的位置:

  1. SYS> select name from v$datafile;  
  2. NAME  
  3. ————————————————  
  4. /u01/app/oracle/oradata/orcl/system01.dbf  
  5. /u01/app/oracle/oradata/orcl/sysaux01.dbf  
  6. /u01/app/oracle/oradata/orcl/undotbs01.dbf  
  7. /u01/app/oracle/oradata/orcl/users01.dbf  
  8. /u01/app/oracle/oradata/orcl/example01.dbf  

查看控制文件的位置:

  1. SYS> select name from v$controlfile;  
  2. NAME  
  3. ————————————————-  
  4. /u01/app/oracle/oradata/orcl/control01.ctl  
  5. /u01/app/oracle/flash_recovery_area/orcl/control02.ctl  

查看日志文件的位置:

  1. SYS> select member from v$logfile;  
  2. MEMBER  
  3. —————————————————  
  4. /u01/app/oracle/oradata/orcl/redo03.log  
  5. /u01/app/oracle/oradata/orcl/redo02.log  
  6. /u01/app/oracle/oradata/orcl/redo01.log  

查看临时文件的位置

  1. SYS> select name from v$tempfile;  

c.关闭数据库,复制物理文件到备份目录:

  1. SYS> shutdown immediate  
  2. Database closed.  
  3. Database dismounted.  
  4. ORACLE instance shut down.  
  5. SYS> exit  
  6. Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – Production  
  7. With the Partitioning, OLAP, Data Mining and Real Application Testing options  
  8. [oracle@localhost ~]$ cd /u01/app/oracle/oradata/orcl/  
  9. [oracle@localhost orcl]$ ls  
  10. control01.ctl redo01.log redo03.log system01.dbf undotbs01.dbf  
  11. example01.dbf redo02.log sysaux01.dbf temp01.dbf users01.dbf  
  12. [oracle@localhost orcl]$ cp * /backup/2013-6/  

d.启动数据库,冷备完成
# 我们可以利用备份的数据克隆一个数据库(环境一致):默认安装数据库dbid为唯一值
[为什么叫克隆呢?因为dbid一致 <== select dbid from v$database],
# 查询数据库版本:select * from v$version 利用冷备份恢复数据库 [物理文件丢失后,数据库在不退出的情况,还能使用,但是数据无效]
(1).关闭数据库
(2).还原备份的数据 [ cp刚才的文件,到数据库的数据文件目录(/u01/app/oracle/oradata/orcl/) ]
(3).启动数据库
# 此模式下恢复,只能恢复到备份时候的状态,不能保证数据的完整性
# [如果刻意要求保证数据完整性,且备份周期短,可将日志文件做的足够大,满足一个备份周期,使其不覆盖重用]

5.优缺点:
(1).优点

冷备模式下概念易于理解,即将需要备份的文件复制到安全的位置 操作比较简单,不需要太多的干预 容易恢复到某个时间点上(只需将文件再拷贝回去)
(2).缺点

备份时,数据库必须处于一致性关闭状态 只能提供到某一时间点的恢复 备份时速度比较慢,尤其是数据量大性能影响比较大 不能实现基于表和用户级别的数据恢复

6.以下为查看checkpoint信息 查看当前数据库的scn号:

  1. SYS> select CHECKPOINT_CHANGE#,CURRENT_SCN from v$database;  
  2. CHECKPOINT_CHANGE# CURRENT_SCN  
  3. —————— ———–  
  4. 1214075             1214308  

查看每个数据文件的checkpoint号

  1. SYS> select FILE#,CHECKPOINT_CHANGE#,LAST_CHANGE# from v$datafile;  
  2. FILE#       CHECKPOINT_CHANGE# LAST_CHANGE#  
  3. ———- —————— ————  
  4. 1             1214075  
  5. 2             1214075  
  6. 3             1214075  
  7. 4             1214075  
  8. 5             1214075  

# LAST_CHANGE#:数据库正常关闭,会产生一个stop scn号,会放置在此处
# 非正常关闭数据库时,此值为空,因为没有做最后一个检查点

从文件头部读取参数:

  1. YS> select FILE#,CHECKPOINT_CHANGE#,CHECKPOINT_COUNT from v$datafile_header;  
  2. FILE#       CHECKPOINT_CHANGE# CHECKPOINT_COUNT  
  3. ———- —————— —————-  
  4. 1               1215193          159  
  5. 2               1215193          159  
  6. 3               1215193          87  
  7. 4               1215193          158  
  8. 5               1215193          83  

# commit时,写日志文件,不一定写数据文件(也就是不一定产生checkpoint号)