zoukankan      html  css  js  c++  java
  • mysql-备份恢复

    一、逻辑备份

    1.生成insert语句

      使用mysqldump

      为了保证数据库中数据的一致性,有以下两种办法可以做到

    • --single-transaction 对于事务支持的存储引擎,如 Innodb 或者 BDB 等 ,将整个备份过程控制在同一个事务中,来达到备份数据的一致性和完整性
    • --lock-tables 让数据库在备份过程中仅提供数据的查询服务,锁定写入的服务,每次仅仅锁定一个数据库的表
    • --lock-all-tables 一次性将需要 dump 的所有表锁定

      其他选项

    • --master-data[=value]”。当添加了 “--master-data=1”的时候,mysqldump 会将当前 MySQL 使用到 binlog 日志的名称和位置记录到 dump 文件中,并且是被以 CHANGE_MASTER 语句的形式记录,如果仅仅只是使用“--master-data”或者“-master-data=2”,则 CHANGE_MASTER 语句会以注释的形式存在。这个选项在实施 slave 的在线搭建的时候是非常有用的,即使不是进行在线搭建 slave,也可以在某些情况下做恢复的过程中通过备份的 binlog 做进一步恢复操作
    • --no-data”仅仅 dump 数据库结构创建脚本
    • --no-create-info”去掉 dump 文件中创建表结构的命令

    2.生成特定格式的纯文本备份数据文件备份

      将数据库中的数据以特定分隔字符将数据分隔记录在文本文件中,以达到逻辑备份的效果。这样的备份数据与 INSERT 命令文件相比,所需要使用的存储空间更小,数据格式更加清晰明确,编辑方便。但是缺点是在同一个备份文件中不能存在多个表的备份数据,没有数据库结构的重建命令。

      一般可以使用以下方法来生成这样的备份集文件:

    • 通过执行 SELECT ... TO OUTFILE FROM ...命令来实现

        该命令有几个需要注意的参数如下:
        实现字符转义功能的“FIELDS ESCAPED BY ['name']” 将 SQL 语句中需要转义的字符进行转义;
        可以将字段的内容“包装”起来的“FIELDS [OPTIONALLY] ENCLOSED BY 'name'”,如果不使用 “OPTIONALLY”则包括数字类型的所有类型数据都会被 “包装”,使用 “OPTIONALLY”之后,则数字类型的数据不会被指定字符“包装”。
        通过"FIELDS TERMINATED BY"可以设定每两个字段之间的分隔符;
        而通过“LINES TERMINATED BY”则会告诉 MySQL 输出文件在每条记录结束的时候需要添加什么字符。


        如以下示例:
        root@localhost : test 10:02:02> SELECT * INTO OUTFILE '/tmp/dump.text'
        -> FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
        -> LINES TERMINATED BY ' '
        -> FROM test_outfile limit 100;


        Query OK, 100 rows affected (0.00 sec)
        root@localhost : test 10:02:11> exit
        Bye
        root@sky:/tmp# cat dump.text
        350021,21,"A","abcd"
        350022,22,"B","abcd"
        350023,23,"C","abcd"
        350024,24,"D","abcd"
        350025,25,"A","abcd"
        ... ...

    • 通过 mysqldump 导出

        可能我们都知道 mysqldump 可以将数据库中的数据以 INSERT 语句的形式生成相关备份文件,其实除了生成 INSERT 语句之外,mysqldump 还同样能实现上面“SELECT ... TO OUTFILE FROM ...”所实现的功能,而且同时还会生成一个相关数据库结构对应的创建脚本 。
        如以下示例:
        root@sky:~# ls -l /tmp/mysqldump
        total 0
        root@sky:~# mysqldump -uroot -T/tmp/mysqldump test test_outfile --fields-enclosed-by=" --fields-terminated-by=,
        root@sky:~# ls -l /tmp/mysqldump
        total 8
        -rw-r--r-- 1 root root 1346 2008-10-14 22:18 test_outfile.sql
        -rw-rw-rw- 1 mysql mysql 2521 2008-10-14 22:18 test_outfile.txt
        root@sky:~# cat /tmp/mysqldump/test_outfile.txt
        350021,21,"A","abcd"
        350022,22,"B","abcd"
        350023,23,"C","abcd"
        350024,24,"D","abcd"
        350025,25,"A","abcd"
        ... ...
        root@sky:~# cat /tmp/mysqldump/test_outfile.sql
        -- MySQL dump 10.11
        ---- Host: localhost Database: test
        -- -------------------------------------------------------- Server version 5.0.51a-log
        /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
        /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
        /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
        /*!40101 SET NAMES utf8 */;
        /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
        /*!40103 SET TIME_ZONE='+00:00' */;
        /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='' */;
        /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
        ---- Table structure for table `test_outfile`
        --DROP TABLE IF EXISTS `test_outfile`;
        SET @saved_cs_client = @@character_set_client;
        SET character_set_client = utf8;
        CREATE TABLE `test_outfile` (
        `id` int(11) NOT NULL default '0',
        `t_id` int(11) default NULL,
        `a` char(1) default NULL,
        `mid` varchar(32) default NULL
        ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
        SET character_set_client = @saved_cs_client;
        /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
        /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
        /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
        /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
        /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
        /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
        -- Dump completed on 2008-10-14 14:18:23


        这样的输出结构对我们做为备份来使用是非常合适的,当然如果一次有多个表需要被dump,就会针对每个表都会生成两个相对应的文件。

    二、逻辑备份恢复方法

      1. 如果是 INSERT 语句的逻辑备份

        a、准备好备份文件,copy 到某特定目录,如“/tmp”下;
        b、通过执行如下命令执行备份集中的相关命令:
          mysql -uusername -p < backup.sql
          或者先通过 mysql 登录到数据库中,然后再执行如下命令:
          root@localhost : (none) 09:59:40> source /tmp/backup.sql
        c、再到数据库中检查相应的数据库对象,看是否已经齐全;
        d、抽查几个表中的数据进行人工校验,并通知开启应用内部测试校验,当所有校验都通过之后,即可对外提供服务了。

      2、如果我们是备份的以特殊分隔符分隔的纯数据文本文件

        a、第一步和 INSERT 备份文件没有区别,就是将最接近崩溃时刻的备份文件准备好;
        b、通过特定工具或者命令将数据导入如到数据库中:
          由于数据库结构创建脚本和纯文本数据备份文件分开存放,所以我们首先需要执行数据库结构创建脚本,然后再导入数据。结构创建脚本的方法和上面第一种备份的恢复测试中的b 步骤完全一样。
          有了数据库结构之后,我们就可以导入备份数据了,如下:
          mysqlimport --user=name --password=pwd test --fields-enclosed-by=" --fields-terminated-by=, /tmp/test_outfile.txt
          或者
          LOAD DATA INFILE '/tmp/test_outfile.txt' INTO TABLE test_outfile FIELDS TERMINATED BY '"' ENCLOSED BY ',';

    二、物理备份

      1.MyISAM 存储引擎
      MyISAM 存储引擎文件的物理文件比较集中,而且不支持事务没有 redo和 undo 日志,对数据一致性的要求也并不是特别的高,所以 MyISAM 存储引擎表的物理备份也比较简单,只要将 MyISAM 的物理文件 copy 出来即可。但是,虽然 MyISAM 存储引擎没有事务支持,对数据文件的一致性要求没有 Innodb 之类的存储引擎那么严格,但是 MyISAM存储引擎的同一个表的数据文件和索引文件之间是有一致性要求的。当 MyISAM 存储引擎发现某个表的数据文件和索引文件不一致的时候,会标记该表处于不可用状态,并要求你进行修复动作,当然,一般情况下的修复都会比较容易。但是,即使数据库存储引擎本身对数据文件的一致性要求并不是很苛刻,我们的应用也允许数据不一致吗?我想答案肯定是否定的,所以我们自己必须保证数据库在备份时候的数据是处于某一个时间点的,这样就要求我们必须做到在备份 MyISAM 数据库的物理文件时让 MyISAM 存储引擎停止写操作, 仅仅提供读服务,其实质就是给数据库表加锁来阻止写操作。

    • MySQL 自己提供了一个使用程序 mysqlhotcopy,这个程序就是专门用来备份 MyISAM 存储引擎的。不过如果你有除了 MyISAM 之外的其他非事务性存储引擎,也可以通过合适的参数设置,或者微调该备份脚本,也都能通过 mysqlhotcopy 程序来完成相应的备份任务。

        基本用法如下:
        mysqlhotcopy db_name[./table_regex/] [new_db_name | directory]


        从上面的基本使用方法我们可以看到,mysqlhotcopy 除了可以备份整个数据库,指定的某个表,还可以通过正则表达式来匹配某些表名来针对性的备份某些表。备份结果就是指定数据库的文件夹下包括所有指定的表的相应物理文件。
        mysqlhotcopy 是一个用 perl 编写的使用程序,其主要实现原理实际上就是:

        a.先 LOCK住表

        b.执行 FLUSH TABLES 动作,该正常关闭的表正常关闭,将该 fsync 的数据都 fsync

        c. 然后通过执行 OS 级别的复制(cp 等)命令,将需要备份的表或者数据库的所有物理文件都复制到指定的备份集位置。

    • 我们也可以通过登录数据库中手工加锁,然后再通过操作系统的命令来复制相关文件执行热物理备份,且在完成文件 copy 之前,不能退出加锁的 session(因为退出会自动解锁),如下:

      root@localhost : test 08:36:35> FLUSH TABLES WITH READ LOCK;
      
    Query OK, 0 rows affected (0.00 sec)


      不退出 mysql,在新的终端下做如下备份:
      mysql@sky:/data/mysql/mydata$ cp -R test /tmp/backup/test
      mysql@sky:/data/mysql/mydata$ ls -l /tmp/backup/
      total 4
      drwxr-xr-x 2 mysql mysql 4096 2008-10-19 21:57 test
      mysql@sky:/data/mysql/mydata$ ls -l /tmp/backup/test
      total 39268
      -rw-r----- 1 mysql mysql 8658 2008-10-19 21:57 hotcopy_his.frm
      -rw-r----- 1 mysql mysql 36 2008-10-19 21:57 hotcopy_his.MYD
      -rw-r----- 1 mysql mysql 1024 2008-10-19 21:57 hotcopy_his.MYI
      -rw-r----- 1 mysql mysql 8586 2008-10-19 21:57 memo_test.frm
      ... ...
      -rw-rw---- 1 mysql mysql 8554 2008-10-19 22:01 test_csv.frm
      -rw-rw---- 1 mysql mysql 0 2008-10-19 22:01 test_csv.MYD
      -rw-rw---- 1 mysql mysql 1024 2008-10-19 22:01 test_csv.MYI
      -rw-r----- 1 mysql mysql 8638 2008-10-19 21:57 test_myisam.frm
      -rw-r----- 1 mysql mysql 20999600 2008-10-19 21:57 test_myisam.MYD
      -rw-r----- 1 mysql mysql 10792960 2008-10-19 21:57 test_myisam.MYI
      -rw-r----- 1 mysql mysql 8638 2008-10-19 21:57 test_outfile.frm
      -rw-r----- 1 mysql mysql 2400 2008-10-19 21:57 test_outfile.MYD
      -rw-r----- 1 mysql mysql 1024 2008-10-19 21:57 test_outfile.MYI
      ... ...


      然后再在之前的执行锁定命令的 session 中解锁
      root@localhost : test 10:00:57> unlock tables;
      Query OK, 0 rows affected (0.00 sec)
      这样就完成了一次物理备份,而且大家也从文件列表中看到了,备份中还有 CSV 存储引擎的表。

      2.Innodb 存储引擎


      Innodb 存储引擎由于是事务性存储引擎,有 redo 日志和相关的 undo 信息,而且对数据的一致性和完整性的要求也比 MyISAM 要严格很多,所以 Innodb 的在线(热)物理备份要比 MyISAM 复杂很多,一般很难简单的通过几个手工命令来完成,大都是通过专门的 Innodb在线物理备份软件来完成。


      Innodb 存储引擎的开发者(Innobase 公司)开发了一款名为 ibbackup 的商业备份软件 ,专门实现 Innodb 存储引擎数据的在线物理备份功能。该软件可以在 MySQL 在线运行的状态下,对数据库中使用 Innodb 存储引擎的表进行备份,不过仅限于使用Innodb 存储引擎的表。


      由于这款软件并不是开源免费的产品,我个人也很少使用,主要也是下载的试用版试用而已,所以这里就不详细介绍了,各位读者朋友可以通过 Innobase 公司官方网站获取详细的使用手册进行试用。

  • 相关阅读:
    推荐几款极简的手机浏览器
    const关键字到底该怎么用
    让你的代码更加优雅的编程技巧-跳转表
    Linux中删除特殊名称文件的多种方式
    mybatis Invalid bound statement (not found)错误解决办法
    Maven 上传文件 Error creating bean with name 'multipartResolver':
    Maven Could not open ServletContext resource [/WEB-INF/applicationContext.xml]
    JS 获取json key和value
    spring 注释
    HttpServletRequest 对文件上传的支持
  • 原文地址:https://www.cnblogs.com/lpfuture/p/5764897.html
Copyright © 2011-2022 走看看