zoukankan      html  css  js  c++  java
  • MySQL具体解释(20)-----------数据库备份和还原

    数据备份:

    使用mysqldump命令备份

    mysqldump命令能够讲数据库中的数据备份成一个文本文件。

    表结果和表中的数据将存储在生成的文本中。mysqldump的工作原理非常easy。

    他先查出须要备份的表结构,在在文本中文件里生存一个create语句,然后,将表中的全部记录转换成一条insert语句,这些create语句和insert语句都是还原时使用。还原数据时就能够使用当中的create语句来创建表,使用当中的insert语句来还原数据。

     

    mysqldump -h主机名  -Pport -uusername -ppassword (–database) 数据库名 > 文件名称.sql

     

    备份MySQL数据库的命令

    mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql



    备份MySQL数据库为带删除表的格式,可以让该备份覆盖已有数据库而不须要手动删除原有数据库。
    mysqldump -–add-drop-table -uusername -ppassword databasename > backupfile.sql



    直接将MySQL数据库压缩备份
    mysqldump -hhostname -uusername -ppassword databasename | gzip > backupfile.sql.gz



    备份MySQL数据库某个(些)表
    mysqldump -hhostname -uusername -ppassword databasename specific_table1 specific_table2 > backupfile.sql



    同一时候备份多个MySQL数据库
    mysqldump -hhostname -uusername -ppassword –databases databasename1 databasename2 databasename3 > multibackupfile.sql


    只备份数据库结构
    mysqldump –no-data –databases databasename1 databasename2 databasename3 > structurebackupfile.sql



    备份server上全部数据库
    mysqldump –all-databases > allbackupfile.sql



    还原MySQL数据库的命令
    mysql -hhostname -uusername -ppassword databasename < backupfile.sql



    还原压缩的MySQL数据库
    gunzip < backupfile.sql.gz | mysql -uusername -ppassword databasename



    将数据库转移到新server

    mysqldump -uusername -ppassword databasename | mysql –host=*.*.*.* -C databasename

    ===============================================================

    JAVA代码调用命令的方法

     

    <span style="font-size:18px;">Process p = Runtime.getRuntime().exec("cmd /c mysqldump -h127.0.0.1 -P3306 -uroot -p123456  customer > d:/opt/customer/dbback/backupfile-1351022418812.sql");
    			// 等待编译结束
    			p.waitFor();
    			// 检查返回码,看编译是否出错。

    int ret = p.exitValue(); System.out.println(ret);</span>


     

     

    MySQL命令行导入数据库:

    1,将要导入的.sql文件移至bin文件下。这种路径比較方便
    2,同上面导出的第1步
    3,进入MySQL:mysql -u username -p
    如我输入的命令行:mysql -u root -p?

    ? (输入相同后会让你输入MySQL的password)
    4,在MySQL-Front中新建你要建的数据库。这时是空数据库,如新建一个名为news的目标数据库
    5,输入:mysql>use 目标数据库名
    如我输入的命令行:mysql>use news;
    6。导入文件:mysql>source 导入的文件名称;
    如我输入的命令行:mysql>source news.sql;

    MySQL备份和还原,都是利用mysqldump、mysql和source命令来完毕的。

     


    1.Win32下MySQL的备份与还原


    1.1 备份
    開始菜单 | 执行 | cmd |利用“cd Program FilesMySQLMySQL Server 5.0in”命令进入bin目录 | 利用“mysqldump? -u username -p databasename >exportfilename”导出数据库到文件,如mysqldump -u root -p voice>voice.sql,然后输入password就可以開始导出。



    1.2 还原
    进入MySQL Command Line Client,输入password,进入到“mysql>”,输入命令"show databases。",回车,看看有些什么数据库。建立你要还原的数据库,输入"create database voice;",回车;切换到刚建立的数据库,输入"use voice。",回车;导入数据。输入"source voice.sql;"。回车。開始导入,再次出现"mysql>"而且没有提示错误即还原成功。


    2.Linux下MySQL的备份与还原


    2.1 备份
    [root@localhost ~]# cd /var/lib/mysql (进入到MySQL库文件夹,依据自己的MySQL的安装情况调整文件夹)
    [root@localhost mysql]# mysqldump -u root -p voice>voice.sql。输入password就可以。


    2.2 还原
    法一:
    [root@localhost ~]# mysql -u root -p 回车。输入password,进入MySQL的控制台"mysql>",同1.2还原。
    法二:
    [root@localhost ~]# cd /var/lib/mysql (进入到MySQL库文件夹,依据自己的MySQL的安装情况调整文件夹)
    [root@localhost mysql]# mysql -u root -p voice<voice.sql,输入password就可以。

     

     

     

     

    以下是版本号2:假设上面不明确的话。能够看以下的解说

     

     

    1、mysqldump

    1.1 备份

    mysqldump 是採用SQL级别的备份机制,它将数据表导成 SQL 脚本文件,在不同的 MySQL 版本号之间升级时相对照较合适。这也是最经常使用的备份方法。
    如今来讲一下 mysqldump 的一些主要參数:

    • --compatible=name

      它告诉 mysqldump,导出的数据将和哪种数据库或哪个旧版本号的 MySQL server相兼容。值能够为 ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options 等。要使用几个值。用逗号将它们隔开。当然了。它并不保证能全然兼容。而是尽量兼容。

    • --complete-insert,-c

      导出的数据採用包括字段名的完整 INSERT 方式,也就是把全部的值都写在一行。这么做能提高插入效率。可是可能会受到 max_allowed_packet 參数的影响而导致插入失败。

      因此,须要慎重使用该參数,至少我不推荐。

    • --default-character-set=charset

      指定导出数据时採用何种字符集,假设数据表不是採用默认的 latin1 字符集的话。那么导出时必须指定该选项。否则再次导入数据后将产生乱码问题。

    • --disable-keys

      告诉 mysqldumpINSERT 语句的开头和结尾添加 /*!40000 ALTER TABLE table DISABLE KEYS */;/*!40000 ALTER TABLE table ENABLE KEYS */; 语句。这能大大提高插入语句的速度,由于它是在插入全然部数据后才重建索引的。该选项仅仅适合 MyISAM 表。

    • --extended-insert = true|false

      默认情况下。mysqldump 开启 --complete-insert 模式。因此不想用它的的话,就使用本选项,设定它的值为 false 就可以。

    • --hex-blob

      使用十六进制格式导出二进制字符串字段。假设有二进制数据就必须使用本选项。

      影响到的字段类型有 BINARY、VARBINARY、BLOB

    • --lock-all-tables,-x

      在開始导出之前,提交请求锁定全部数据库中的全部表,以保证数据的一致性。这是一个全局读锁,而且自己主动关闭 --single-transaction --lock-tables 选项。

    • --lock-tables

      它和 --lock-all-tables 类似,只是是锁定当前导出的数据表。而不是一下子锁定所有库下的表。本选项仅仅适用于 MyISAM 表,假设是 Innodb 表能够用 --single-transaction 选项。

    • --no-create-info,-t

      仅仅导出数据。而不加入 CREATE TABLE 语句。

    • --no-data,-d

      不导出不论什么数据,仅仅导出数据库表结构。

    • --opt

      这仅仅是一个快捷选项。等同于同一时候加入 --add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset 选项。本选项能让 mysqldump 非常快的导出数据。而且导出的数据能非常快导回。该选项默认开启。但能够用 --skip-opt 禁用。注意。假设执行 mysqldump 没有指定 --quick--opt 选项,则会将整个结果集放在内存中。假设导出大数据库的话可能会出现故障。

    • --quick。-q

      该选项在导出大表时非常实用。它强制 mysqldump 从server查询取得记录直接输出而不是取得全部记录后将它们缓存到内存中。

    • --routines。-R

      导出存储过程以及自己定义函数。

    • --single-transaction

      该选项在导出数据之前提交一个 BEGIN SQL语句,BEGIN 不会堵塞不论什么应用程序且能保证导出时数据库的一致性状态。

      它仅仅适用于事务表,比如 InnoDBBDB
      本选项和 --lock-tables 选项是相互排斥的,由于 LOCK TABLES 会使不论什么挂起的事务隐含提交。
      要想导出大表的话,应结合使用 --quick 选项。

    • --triggers

      同一时候导出触发器。该选项默认启用,用 --skip-triggers 禁用它。

    其它參数详情请參考手冊。我通常使用下面 SQL 来备份 MyISAM 表:

    /usr/local/mysql/bin/mysqldump -uyejr -pyejr 
    --default-character-set=utf8 --opt --extended-insert=false 
    --triggers -R --hex-blob -x db_name > db_name.sql
    

    使用下面 SQL 来备份 Innodb 表:

    /usr/local/mysql/bin/mysqldump -uyejr -pyejr 
    --default-character-set=utf8 --opt --extended-insert=false 
    --triggers -R --hex-blob --single-transaction db_name > db_name.sql
    

    另外,假设想要实如今线备份,还能够使用 --master-data 參数来实现,例如以下:

    /usr/local/mysql/bin/mysqldump -uyejr -pyejr 
    --default-character-set=utf8 --opt --master-data=1 
    --single-transaction --flush-logs db_name > db_name.sql
    

    它仅仅是在一開始的瞬间请求锁表,然后就刷新binlog了,而后在导出的文件里增加CHANGE MASTER 语句来指定当前备份的binlog位置,假设要把这个文件恢复到slave里去,就能够採用这样的方法来做。

    1.2 还原

    mysqldump 备份出来的文件是一个能够直接倒入的 SQL 脚本,有两种方法能够将数据导入。

    • 直接用 mysql client

      比如:

      /usr/local/mysql/bin/mysql -uyejr -pyejr db_name < db_name.sql
      

       

    • 用 SOURCE 语法

      事实上这不是标准的 SQL 语法,而是 mysql client提供的功能。比如:

      SOURCE /tmp/db_name.sql;
      

      这里须要指定文件的绝对路径,而且必须是 mysqld 执行用户(比如 nobody)有权限读取的文件。

    2、 mysqlhotcopy

    2.1 备份

    mysqlhotcopy 是一个 PERL 程序,最初由Tim Bunce编写。

    它使用 LOCK TABLES、FLUSH TABLES cpscp 来高速备份数据库。它是备份数据库或单个表的最快的途径。但它仅仅能执行在数据库文件(包含数据表定义文件、数据文件、索引文件)所在的机器上。mysqlhotcopy 仅仅能用于备份 MyISAM,而且仅仅能执行在 类UnixNetWare 系统上。

    mysqlhotcopy 支持一次性拷贝多个数据库,同一时候还支持正则表达。下面是几个样例:

    root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr 
    db_name /tmp (把数据库文件夹 db_name 复制到 /tmp 下)
    root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr 
    db_name_1 ... db_name_n /tmp
    root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr 
    db_name./regex/ /tmp
    

    更具体的用法请查看手冊,或者调用以下的命令来查看 mysqlhotcopy 的帮助:

    perldoc /usr/local/mysql/bin/mysqlhotcopy
    

    注意,想要使用 mysqlhotcopy,必需要有 SELECT、RELOAD(要运行 FLUSH TABLES) 权限。而且还必需要可以有读取 datadir/db_name 文件夹的权限。

    2.2 还原

    mysqlhotcopy 备份出来的是整个数据库文件夹,使用时能够直接复制到 mysqld 指定的 datadir (在这里是 /usr/local/mysql/data/)文件夹下就可以,同一时候要注意权限的问题。例如以下例:

    root#cp -rf db_name /usr/local/mysql/data/
    root#chown -R nobody:nobody /usr/local/mysql/data/ (将 db_name 文件夹的属主改成 mysqld 执行用户)
    

     

    3、 SQL 语法备份

    3.1 备份

    BACKUP TABLE 语法事实上和 mysqlhotcopy 的工作原理差点儿相同,都是锁表,然后拷贝数据文件。

    它能实如今线备份。可是效果不理想。因此不推荐使用。它仅仅拷贝表结构文件和数据文件,不同一时候拷贝索引文件。因此恢复时比較慢。
    样例:

    BACK TABLE tbl_name TO '/tmp/db_name/';
    

    注意。必需要有 FILE 权限才干运行本SQL。而且文件夹 /tmp/db_name/ 必须能被 mysqld 用户可写。导出的文件不能覆盖已经存在的文件,以避免安全问题。

    SELECT INTO OUTFILE 则是把数据导出来成为普通的文本文件。能够自己定义字段间隔的方式,方便处理这些数据。


    样例:

    SELECT * INTO OUTFILE '/tmp/db_name/tbl_name.txt' FROM tbl_name;
    

    注意。必需要有 FILE 权限才干运行本SQL,而且文件 /tmp/db_name/tbl_name.txt 必须能被 mysqld 用户可写,导出的文件不能覆盖已经存在的文件,以避免安全问题。

    3.2 恢复

    BACKUP TABLE 方法备份出来的文件,能够执行 RESTORE TABLE 语句来恢复数据表。
    样例:

    RESTORE TABLE FROM '/tmp/db_name/';
    

    权限要求类似上面所述。

    SELECT INTO OUTFILE 方法备份出来的文件。能够执行 LOAD DATA INFILE 语句来恢复数据表。
    样例:

    LOAD DATA INFILE '/tmp/db_name/tbl_name.txt' INTO TABLE tbl_name;
    

    权限要求类似上面所述。

    倒入数据之前,数据表要已经存在才行。假设操心数据会发生反复。能够添加 REPLACE keyword来替换已有记录或者用 IGNORE keyword来忽略他们。

    4、 启用二进制日志(binlog)

    採用 binlog 的方法相对来说更灵活,省心省力。并且还能够支持增量备份。

    启用 binlog 时必需要重新启动 mysqld。首先。关闭 mysqld。打开 my.cnf,增加下面几行:

    server-id = 1
    log-bin = binlog
    log-bin-index = binlog.index
    

    然后启动 mysqld 就能够了。

    执行过程中会产生 binlog.000001 以及 binlog.index。前面的文件是 mysqld 记录全部对数据的更新操作,后面的文件则是全部 binlog 的索引。都不能轻易删除。

    关于 binlog 的信息请查看手冊。

    须要备份时。能够先运行一下 SQL 语句。让 mysqld 终止对当前 binlog 的写入,就能够把文件直接备份。这种话就能达到增量备份的目的了:

    FLUSH LOGS;

    假设是备份复制系统中的从server。还应该备份 master.inforelay-log.info 文件。

    备份出来的 binlog 文件能够用 MySQL 提供的工具 mysqlbinlog 来查看,如:

    /usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001
    

    该工具同意你显示指定的数据库下的全部 SQL 语句。而且还能够限定时间范围。相当的方便。具体的请查看手冊。

    恢复时。能够採用类似下面语句来做到:

    /usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001 | mysql -uyejr -pyejr db_name
    

    mysqlbinlog 输出的 SQL 语句直接作为输入来运行它。

    假设你有空暇的机器,最好还是採用这样的方式来备份。因为作为 slave 的机器性能要求相对不是那么高,因此成本低,用低成本就能实现增量备份并且还能分担一部分数据查询压力,何乐而不为呢?

    5、 直接备份数据文件

    相较前几种方法。备份数据文件最为直接、高速、方便,缺点是基本上不能实现增量备份。

    为了保证数据的一致性,须要在靠背文件前。运行下面 SQL 语句:

    FLUSH TABLES WITH READ LOCK;

    也就是把内存中的数据都刷新到磁盘中,同一时候锁定数据表。以保证拷贝过程中不会有新的数据写入。这样的方法备份出来的数据恢复也非常easy,直接拷贝回原来的数据库文件夹下就可以。

    注意,对于 Innodb 类型表来说。还须要备份其日志文件,即 ib_logfile* 文件。由于当 Innodb 表损坏时。就能够依靠这些日志文件来恢复。

    6、 备份策略

    对于中等级别业务量的系统来说。备份策略能够这么定:第一次全量备份,每天一次增量备份,每周再做一次全量备份,如此一直反复。而对于重要的且繁忙的系统来说,则可能须要每天一次全量备份。每小时一次增量备份,甚至更频繁。

    为了不影响线上业务,实如今线备份,而且能增量备份,最好的办法就是採用主从复制机制(replication)。在 slave 机器上做备份。

    7、 数据维护和灾难恢复

    作为一名DBA(我眼下还不是,呵呵)。最重要的工作内容之中的一个是保证数据表能安全、稳定、快速使用。

    因此。须要定期维护你的数据表。下面 SQL 语句就非常实用:

    CHECK TABLE 或 REPAIR TABLE,检查或维护 MyISAM 表
    OPTIMIZE TABLE,优化 MyISAM 表
    ANALYZE TABLE,分析 MyISAM 表
    

    当然了。上面这些命令起始都能够通过工具 myisamchk 来完毕,在这里不作详述。

    Innodb 表则能够通过运行下面语句来整理碎片。提高索引速度:

    ALTER TABLE tbl_name ENGINE = Innodb;
    

    这事实上是一个 NULL 操作。表面上看什么也不做,实际上又一次整理碎片了。

    通常使用的 MyISAM 表能够用上面提到的恢复方法来完毕。假设是索引坏了,能够用 myisamchk 工具来重建索引。

    而对于 Innodb 表来说,就没这么直接了。由于它把全部的表都保存在一个表空间了。

    只是 Innodb 有一个检查机制叫 模糊检查点,仅仅要保存了日志文件,就能依据日志文件来修复错误。能够在 my.cnf 文件里,添加下面參数,让 mysqld 在启动时自己主动检查日志文件:

    innodb_force_recovery = 4
    

    关于该參数的信息请查看手冊。

    8、 总结

    做好数据备份,定仅仅好合适的备份策略,这是一个DBA所做事情的一小部分,万事开头难。就从如今開始吧。

     

  • 相关阅读:
    iOS项目的目录结构和开发流程
    XCode SVN设置
    iOS 登录 注册
    ios开发常用技巧
    iOS问题解答
    iOS设计模式
    iOS开发:打包应用程序
    iOS 封装
    iOS开发常用宏
    Objective-C 类,实例成员,静态变量,对象方法,类方法(静态方法),对象
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7347153.html
Copyright © 2011-2022 走看看