备份与还原

来源:互联网 发布:linux查看hba卡信息 编辑:程序博客网 时间:2024/06/05 01:53

备份与还原

    恢复:从备份记录中获取数据,加载到MySQL里
    还原:描述救援整个系统或系统一部分的过程

    常规事项

        1.裸备份对于大型数据必要的。运行速度快。常选择的是基于快照的备份,如果是InnoDB,使用InnoDB热备份
        2.备份用于即使点还原的二进制日志
        3.多保留几个备份记录,二进制日志要足够长
        4.定期测试备份/还原过程
        5.创建逻辑备份(如果基于裸备份会比较好)
        6.如果可能,需要测试一下裸备份
        7.需要考虑安全问题
        8.使用备份工具监控备份记录和备份过程
        9.灵活运用机器间复制文件的方法

    权衡的事项:

        1.能承受的损失
        2.在线备份还是离线备份。离线备份简单,安全,但关闭和启动高负载大数据的MySQL耗费的时间比较长。在线备份可以在复制从服务器上做,做在线备份时,要不影响到服务器上的服务,很难做到
        3.逻辑备份还是裸备份。
            逻辑备份优点:
                    1.普通文件
                    2.容易恢复
                    3.可以跨网络进行备份和恢复
                    4.很强的兼容性
                    5.独立于具体的存储引擎
                    6.避免数据损坏
            缺点:        
                    1.服务器必须亲自生成,使用多的CPU周期
                    2.可能会被原数据更大
                    3.浮点数会丢失精度信息
                    4.从逻辑备份中恢复数据需要MySQL加载和解释声明,重建索引,增加额外工作量
            最大的不利因素是从MySQL导出数据的开销和使用SQL把数据导回去的开销
            裸备份优点:
                    1.只需要复制文件
                    2.备份的数据更加简单,innoDB需要先关闭MySQL服务器
                    3.便于跨平台,操作系统和MySQL版本
                    4.数据恢复更快
            缺点:
                    1.InnoDB裸文件比相应的逻辑文件大
            推荐的方法:先做裸副本,然后开启MySQL服务器,在副本的基础上生成逻辑备份。如果有文件系统快照的功能,可以先做一个快照,把快照复制到另一台服务器上释放,测试这些裸文件,做逻辑备份

    备份内容

        1.二进制日志,InnoDB事务日志
        2.代码,包括触发器,存储过程
        3.复制配置信息,比如二进制日志,转发日志,日志索引文件及.info文件。至少包含SHOW MASTER STATUS/SHOW SLAVE STATUS 的输出内容
        4.服务器配置信息
        5.操作系统文件

    增量备份

        1.备份二进制日志
        2.只备份二进制日志里变化部分
        3.只备份数据文件变化部分
        数据还原时复杂性会提高

存储引擎和一致性

    数据一致性:备份的时候,必须保证数据在即使点上是一致的
    文件一致性:备份的文件要保持一致性。MyISAM,需要LOCK TABLES/FLUSH TABLES或者FLUSH TABLES WITH READ LOCK,刷新缓存,然后取得MyISAM文件的裸备份。InnoDB,不仅要确保文件内部一致性,还要在同一时刻复制日志文件和表空间文件,即使使用FLUSH TABLES WITH READ LOCK,InnoDB仍会在后台运行:插入缓冲区,日志和写线程继续把数据更新写到日志和表空间。
            解决办法:1)等到InnoDB里清除线程和插入缓冲区线程退出 2)利用LVM对数据和日志文件做一致性快照

管理和备份二进制日志

    二进制日志的服务器配置:
                log_bin = mysql-bin
                sync_binlog = 1
                innodb_support_xa = 1

数据备份

    逻辑备份:

        1)SQL导出:使用mysqldump。
          缺点:1.样式和数据存放在一起,单一文件恢复比较方便
                2.执行,解析所有的SQL语句工作量很大
                3.生成的单一文件很大
                4.成本昂贵
        2)使用定界符文件备份:使用SELECT INTO OUTFILE。文件里数据用ASCII表示的裸数据
            SELECT * INTO OUTFILE '/tmp/t1.txt'
            FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY ' " '
            LINES TERMINATED BY '\n'
            FROM test.t1;
            使用LOAD DATA INFILE导入
            LOAD DATA INFILE '/tmp/t1.txt'
            INTO TABLES test.t1
            FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY ' " '
            LINES TERMINATED BY '\n';
          局限性:只能在MySQL运行的机器上把数据备份到一个文件里,MySQL必须有权限访问要生成文件的那个目录,无法导出一个压缩文件,不能覆盖已存在的文件

    文件快照系统:

        有快照功能的文件系统能够在瞬间将它的内容做一个一致的镜像,镜像可以用来做备份。
        做一个快照只是减少锁定时间的一个简单手段,在释放锁之后,把这些文件复制到备份去。
        LVM快照:使用写时复制创建快照,即时获得全部卷的一个逻辑副本。LVM只简单标注一下做快照的时间,不把数据复制到快照里,需要数据时,才从数据来源的卷里读出来。数据发生改动时,受到影响的数据块复制到存储区域里,每一个数据库只有在第一次写入时才会触发写时复制,从而把数据复制到保留区域里。读取快照里已被复制过的数据块时,LVM会从保留存储区域里读取数据。需要足够的空间保存来源卷数据更改时要复制的数据块。
        先决条件:
            1.所有InnoDB文件在一个逻辑卷里
            2.如果需要备份表定义,MySQL数据目录必须在同一个逻辑卷里
            3.分卷组里必须有足够的空闲空间来创建快照
        创建快照
            lvcreate --size 16G --snapshot --name backup_mysql /dev/vg/mysql
            lvs查看最近分卷状态
        挂载快照
            mkdir /tmp/backup
            mount /dev/mapper/vg-backup_mysql /tmp/backup
            ls -l /tmp/backup/mysql
        卸载快照
            umount /tmp/backup
            rmdir /tmp/backup
            lvremove --force /dev/vg/backup_mysql
        在线备份InnoDB
            先FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;
            记录SHOW MASTER STATUS的输出信息,确认连接着MySQL和没有释放掉锁。
            做LVM快照,然后使用UNLOCK TABLES或者关闭数据库连接把锁释放掉
            把快照挂载接上,复制里面的文件到备份位置上
        可以做InnoDB的无锁快照
            就是不用先FLUSH TABLES WITH READ LOCK;但必须在InnoDB里数据和日志文件一起做快照
        规划LVM备份
            1.LVM只把更新的数据块复制到快照里一次
            2.InnoDB的写入数据会对快照建立初期有影响
            3.在数据块被复制到快照之前,估计数据块写入时I/O的数量
            4.使用vmstat,iostat获取统计信息,获知服务器在每一秒里写多少个数据块
            5.测量把备份复制到别的位置上花费的时间

从备份中还原

    可能的步骤:
            1.关闭MySQL服务器
            2.在服务器配置和文件权限上做好记录
            3.把数据从备份记录到MySQL数据目录下
            4.更改配置,文件权限
            5.在有限访问权下重启服务器,然后等它完全启动
            6.重新加载逻辑备份文件
            7.检查和重放二进制日志
            8.核实恢复出来的内容
            9.使用完全访问重启服务器

    1.还原裸文件

            MyISAM不需要关闭服务器,只要复制每个表的.frm,.MYI,.MYD,在复制表文件之前,应该把打开的表删除,或者重命名,或者使用LOCK TABLES 和 FLUSH TABLES关闭
            InnoDB需要先关闭MySQL,把复制文件移到其他地方,然后重启MySQL,还要确认事务日志文件与表空间文件是相匹配的
            在启动MySQL之前,需要检查服务器配置,确定还原的文件有正确的owner和权限,也需要查看MySQL的错误日


    2.还原逻辑文件

            加载SQL文件
                mysql < backup.sql
                也可以使用SOURCE,关闭日志,加载文件时,不要重新启动MySQL服务器
                SET SQL_LOG_BIN = 0;
                SOURCE backup.sql;
                SET SQL_LOG_BIN = 1;
                最好把每个表备份到自己的文件里
                如果压缩了备份记录:gunzip -c backup.sql.gz | mysql
            加载定界符文件
                使用LOAD DATA INFILE或者mysqlimport
                解压缩的优化:建立命名管道和流,把数据压缩到里面
                mkfifo /tmp/backup/backup.fifo
                chmod 666 /tmp/backup/backup.fifo
                gunzip -c /tmp/backup/backup.txt.gz > /tmp/backup/backup.fifo
                加载文件
                SET SQL_LOG_BIN = 0;
                LOAD DATA INFILE '/tmp/backup/backup.fifo'
                INTO TABLE backup;

    3.即时点还原(例子)

            备份复制(myISAM):FLUSH TABLES WITH READ LOCK;
                      cp -a /var/lib/mysql/sakila /backup/sakila;
                      FLUSH LOGS;
                      mysql -e "SHOW MASTER STATUS" --vertical > /backup/master.info;
                      UNLOCK TABLES;
            还原:
            1./etc/init.d/mysql stop
              mv /var/lib/mysql/sakila /var/lib/mysql/sakila.tmp
              cp -a /backup/sakila /var/lib/mysql
            2.在my.cnf加入:skip-networking
                    socket=/tmp/mysql_recover.sock
            3./etc/init.d/mysql start
            4.mysqlbinlog --database=sakila /var/log/mysql/mysql-bin.000215 | grep -B 3 -i 'drop table

sakila.payment'
            5.mysqlbinlog --database=sakila /var/log/mysql/mysql-bin.000215 --stop-position=352 | mysql -

uroot -p
              mysqlbinlog --database=sakila /var/log/mysql/mysql-bin.000215 --start-position=429 | mysql -

uroot -p
            6.检查确保结果正确,关闭服务器,把my.cnf配置改回来,重启服务器

    4.InnoDB还原

            InnoDB每次启动时检查数据和日志文件,确定是否需要还原,根据日志里事务状态,把数据更新到数据文件或者回滚
            InnoDB损坏问题与硬件相关联。常见配置不当是RAID卡开启了writeback缓存,而RAID卡没有后备电源,或者磁盘驱动器上开启了writeback缓存。会导致控制器或驱动器谎报fsync()已经完成,实际上数据还在writeback缓存里,而不是磁盘上。
            还原InnoDB:
                    1.二级索引损坏,可以使用OPTIMIZE TABLE,或者SELECT INTO OUTFILE,然后删除并重建表,最后使用LOAD DATA INFILE
                    2.集群索引损坏,可能用innodb_force_recovery设置来导出表
                    3.系统结构损坏,可能需要做整个库的导出和还原

备份工具

    1.mysqldump

            mysqldump --host=server1 test t1 | mysql --host=server2 test
            mysqldump --all-database > dump.sql
            mysqldump --database sakila > dump.sql
            mysqldump sakila actor > dump.sql
            mysqldump sakila actor --result-file=dump.sql
            常用选项:--opt  --lock-all-tables
            逻辑备份,速度慢

    2.mysqlhotcopy

            perl脚本,为MyISAM设计

    3.InnoDB热备份(ibbackup)

            不用停止MySQL,设置锁
            提供一个与服务器上my.cnf相匹配的文件,放在不同目录下。把InnoDB文件从服务器复制到第二个配置文件指定的位置上:ibbackup /etc/my.cnf  /etc/ibbackup.cnf
            还原备份时,先关闭MySQL:ibbackup --restore /etc/ibbackup.cnf
            只复制了InnoDB文件
            裸备份,速度快
原创粉丝点击