7章备份和恢复

目录

7.1备份和恢复类型
7.2数据库备份方法
7.3实例的备份和恢复策略
7.3.1建立备份策略
7.3.2使用备份恢复
7.3.3备份策略总结
7.4使用mysqldump备份
7.4.1数据转储与mysqldump SQL格式
7.4.2重装SQL格式备份
7.4.3倾销数据分隔符的文本格式,mysqldump
7.4.4重装分隔符的文本格式备份
7.4.5 mysqldump贴士
在时间7.5点(增量)使用二进制日志恢复
在使用事件的时间点恢复7.5.1
在使用事件位置的时间点恢复7.5.2
7.6 MyISAM表的维护和故障恢复
7.6.1用于崩溃恢复myisamchk
7.6.2如何检查MyISAM表错误
7.6.3如何修复MyISAM表
美国MyISAM表优化
7.6.5建立MyISAM表的维护计划

这是备份你的数据库,你可以恢复你的数据,并在问题发生时再运行至关重要,如系统崩溃,硬件故障,或用户误删除数据。备份也基本为维护升级MySQL安装之前,他们可以用来传递一个MySQL安装另一个系统或设置复制从服务器。

MySQL提供多种备份策略,你可以从中选择最适合您的安装要求的方法。本章讨论了几种备份与恢复的话题,你应该熟悉:

额外资源

备份或维护数据的可用性相关的资源包括以下:

7.1备份和恢复类型

本节描述了不同类型的备份的特点。

物理(原)与逻辑备份

物理备份的目录由原拷贝和文件存储数据库的内容。这种类型的备份是适合大,需要恢复的很快出现问题时重要的数据库。

逻辑备份保存信息表示为逻辑数据库结构(CREATE DATABASECREATE TABLE报表)和内容(INSERT陈述或分隔的文本文件)。这种类型的备份是适用于少量的数据,你可以编辑数据值或表结构,或创建的数据在不同的机器架构。

物理备份的方法有以下特点:

  • 备份包括数据库目录和文件的精确副本。通常这是一个复制的全部或部分的MySQL数据目录。

  • 物理备份方法的速度比逻辑因为他们只涉及文件复制没有转换。

  • 输出更紧凑比逻辑备份。

  • 因为备份速度和紧凑繁忙,重要的数据库,MySQL企业备份产品进行物理备份。对于MySQL企业备份产品的概述,看29.2节,“MySQL企业备份概述”

  • 备份和恢复的粒度范围从水平对整个数据目录下的不同文件的水平。这可能会或可能不会提供表级别的粒度,取决于存储引擎。例如,InnoDB表的每一个都可以在一个单独的文件中,或与他人共享文件存储InnoDB每个表;MyISAM表的唯一对应一组文件。

  • 除了数据库,备份可以包括任何相关的文件,如日志和配置文件。

  • 数据从MEMORY表是很难支持这种方式因其内容不存储在磁盘上。(MySQL企业备份产品有一个特点,你可以从中检索数据内存在一个备份表。)

  • 备份到其他机器,便携式只有具有相同或相似的硬件特性。

  • 备份可以在MySQL服务器没有运行进行。如果服务器正在运行,有必要进行适当的锁定,服务器不在备份数据库内容的变化。MySQL企业备份会自动锁表需要它。

  • 物理备份工具包括mysqlbackupMySQL企业备份InnoDB或任何其他表或文件系统级的命令(如内容提供商SCP焦油远程同步MyISAM

  • 为恢复:

    • MySQL企业备份恢复InnoDB和其他的表,它支持了。

    • _ NDB的恢复恢复NDB

    • 文件复制在文件系统层可以复制回原来的位置的文件系统命令。

逻辑备份方法有以下特点:

  • 备份是通过查询MySQL服务器获取数据库的结构和内容信息。

  • 备份比物理方法慢,因为服务器需要访问数据库信息并将其转换为逻辑格式。如果输出是写在客户端,服务器必须发送到备份程序。

  • 输出大于物理备份,特别是当保存为文本格式。

  • 备份和恢复的粒度可在服务器级别(所有数据库),数据库(在一个特定的数据库中的所有表),或表级。无论存储引擎,这是真的。

  • 备份不包括日志和配置文件,或其他相关的数据库不属于数据库文件。

  • 存储在逻辑格式的备份机独立和高度便携。

  • 逻辑备份与MySQL服务器的运行进行。服务器没有脱机。

  • 逻辑备份的工具包括mysqldump程序和SELECT ... INTO OUTFILE声明。这些工作的任何存储引擎,甚至内存

  • 恢复逻辑备份,SQL格式的转储文件可以加工利用MySQL客户加载分隔的文本文件,使用LOAD DATA INFILE声明或mysqlimport客户

在线与离线备份

在线备份发生在MySQL服务器运行的是使数据库的信息可以从服务器获取。离线备份发生在服务器停止。这种区别也可以被描述为对比寒冷的一个备份;温暖的备份是一个地方的服务器仍在运行但锁定在修改数据时访问数据库文件外。

在线备份的方法有以下特点:

  • 备份不侵入到其他客户端,可以连接到MySQL服务器的备份过程和能够访问数据根据需要执行什么操作。

  • 必须实施适当的锁定,修改数据不发生,会危及备份的完整性。MySQL企业备份产品这样的自动锁。

脱机备份的方法有以下特点:

  • 客户可以因为在备份服务器不可用的不利影响。因此,这样的备份通常是从一个复制从服务器可以不损害可用性脱机。

  • 备份程序更简单,因为没有可能从客户活动的干扰。

在线和离线之间的相似区分申请恢复操作,和类似特性的应用。然而,更有可能的是,客户将在线恢复的影响比在线备份因为复苏需要更强的锁紧。备份过程中,客户可能能够读取数据时,备份。恢复修改数据而不只是读它,因此客户必须防止访问数据时正在恢复。

本地与远程备份

本地备份在同一主机上运行MySQL服务器进行,而远程备份是从不同的主机做。对于某些类型的备份,备份可以由远程主机即使输出写入本地服务器。主机。

  • mysqldump可以连接到本地或远程服务器。SQL输出(CREATEINSERT语句),本地或远程转储可以生成在客户端输出。为带分隔符的文本输出(与--tab选项),数据文件服务器主机上创建。

  • SELECT ... INTO OUTFILE可以从本地或远程客户端发起的,但输出文件服务器主机上创建。

  • 物理备份的方法通常是在本地主机启动MySQL服务器,服务器可以脱机,虽然复制的文件的目的地可能是远程。

快照备份

一些文件系统的实现使快照应采取。这些提供的文件系统的逻辑副本,在给定的时间点,而不需要对整个文件系统的物理复制。(例如,的实现可以使用写时复制技术使文件系统的快照时间后只需要修改部分被复制。)MySQL本身不带文件系统快照提供能力。它可通过第三方解决方案如Veritas、LVM、或ZFS。

全与增量备份

一个完整的备份,包括所有的数据由一个MySQL服务器在给定的时间点。增量备份的数据在一个给定的时间跨度的变化(从一个时间点到另一个)。MySQL有不同的方法来执行完整备份,如本节前面所描述的。增量备份是通过使服务器的二进制日志成为可能,该服务器用于记录数据的变化。

全对的时间点恢复(增量)

完全康复,恢复所有数据从完整备份。这使服务器实例的状态,它有备份的时候了。如果国家没有足够的电流,完全康复,可以通过增量备份以来的全备份恢复,使服务器更新的状态。

增量的恢复是在一个给定的时间跨度的变化恢复。这也被称为时间点恢复因为它使服务器的状态流到一个给定的时间。时间点恢复是基于二进制日志,通常遵循一个完整恢复从备份文件恢复到服务器状态备份的时候了。然后数据变化写在二进制日志文件作为增量恢复重做数据的修改,将服务器上需要的点的时间。

表维护

数据完整性可能会受到影响,如果表成为腐败。为InnoDB表,这是不是一个典型的问题。程序检查MyISAM表和维修,如果发现有问题,看7.6节,“MyISAM表的维护和故障恢复”

备份调度,压缩和加密

备份调度有自动备份程序。备份输出压缩减少空间要求和输出加密提供了更好的安全性,防止未经授权的访问备份数据。MySQL本身并不提供这些功能。MySQL企业备份产品可以压缩InnoDB备份,以及备份输出压缩或加密可以使用文件系统工具实现。其他第三方解决方案可。

7.2数据库备份方法

本节总结了一些通用的方法制作备份。

MySQL企业备份制作热备份

MySQL企业版的用户可以使用MySQL企业备份产品做身体的整个实例的备份或选定的数据库表,或。本产品具有以下功能增量压缩的备份。备份物理数据库文件进行恢复比逻辑技术如快得多mysqldump命令InnoDB表复制使用热备份机制.(理想的InnoDB表应该代表了相当多数的数据。)从其他存储引擎的表复制使用热备份机制.对于MySQL企业备份产品的概述,看29.2节,“MySQL企业备份概述”

用mysqldump备份

这个mysqldump程序可以备份。它可以备份各种表。(见7.4节,“使用mysqldump备份”。)

InnoDB表,可以执行联机备份,不需要锁表的使用--single-transaction选项mysqldump。看到第7.3.1、“建立备份策略”

通过复制表文件备份

MyISAM表可以由表复制文件(*.MYD我*文件,以及相关的*.sdi文件)。得到一个一致的备份,停止服务器或锁和同花顺相关表:

冲洗表tbl_list读锁;

你只需要一个读锁;这使其他客户继续查询表,当你在数据库目录复制文件。冲洗是需要确保所有活跃指数的页面写入到磁盘之前先备份。看到第13.3.6,“锁表和解锁表语法”,和第13.7.7.3“同花顺语法”

你也可以创建简单的拷贝表格文件的二进制备份,只要服务器不更新任何东西。(但注意表文件复制的方法不如果你的数据库中包含的工作InnoDB表另外,即使服务器不积极更新数据,InnoDB仍有可能修改的数据缓存在内存中而不是刷新到磁盘。)

对于这种备份方法的一个例子,指的是出口和进口的例子第13.2.5,“导入表语法”

在分隔符的文本文件备份

创建一个包含表数据的文本文件,你可以使用SELECT * INTO OUTFILE 'file_name' FROM tbl_name。该文件是对MySQL服务器主机创建,没有客户端主机。对于这一说法,输出文件不能已经存在,因为允许文件覆盖构成安全风险。看到第13.2.10,选择“语法”。此方法适合任何类型的数据文件,但仅保存表数据表结构,不。

另一种方式来创建文本数据文件(连同文件包含CREATE TABLE为备份表报表)是使用mysqldump--tab选项看到7.4.3节、“分隔符的文本格式的数据就“倾销

重装分隔的文本数据文件,使用LOAD DATA INFILEmysqlimport

通过启用二进制日志进行增量备份

MySQL支持增量备份:你必须启动服务器--log-bin选项可启用二进制日志;看5.4.4节,“二进制日志”。二进制日志文件提供你需要复制的变化,都在这一点上你进行备份后的数据库信息。此刻你要做一个增量备份(含所有的变化,发生了自上次完整或增量备份),你应该用旋转的二进制日志FLUSH LOGS。这样做,你需要复制到备份位置的所有二进制日志,范围从上个完整或增量备份到最后一刻。这些二进制日志增量备份;还原时,您的应用的解释7.5节,“时间点(增量)使用二进制日志恢复”。下一次你做一个完整的备份,你也应该旋转的二进制日志使用FLUSH LOGSmysqldump -冲-日志。看到4.5.4“,”mysqldump一个数据库的备份计划”

使用奴隶制作备份复制

如果你有你的主服务器的性能问题而进行了备份,一个策略,可以帮助建立和执行备份复制的奴隶,而不是主人。看到第17.3.1,使用复制备份”

如果备份从复制服务器,你应该回到它的主人信息和中继日志信息库(参见第17.2.4,“复制继电器和状态日志”)当你回到奴隶的数据库,无论你选择的备份方法。这种信息总是需要你恢复奴隶的数据后恢复复制。如果你的奴隶被复制LOAD DATA INFILE陈述,你也应该支持任何sql_load *文件存在,奴隶使用目录为此。奴隶需要这些文件恢复任何中断复制LOAD DATA INFILEOperations .这座工厂的租赁是它的价值。--slave-load-tmpdir选项如果服务器没有启动这个选项,目录位置的价值tmpdir系统变量

恢复损坏的表

如果你要恢复MyISAM这已经成为腐败的表,试图恢复他们使用REPAIR TABLEmyisamchk - R的第一应该在99.9%的情况下工作。如果myisamchk失败了,看7.6节,“MyISAM表的维护和故障恢复”

使用文件系统快照备份

如果您使用的是一个文件系统,你可以做一个备份,这样:

  1. 从一个客户端程序,执行FLUSH TABLES WITH READ LOCK

  2. 从另一个内核,执行mount vxfs snapshot

  3. 从第一个客户,执行UNLOCK TABLES

  4. 从快照拷贝文件

  5. 卸载快照

类似的快照功能可以在其它文件系统可用,如LVM或ZFS。

7.3实例的备份和恢复策略

该部分论述了执行备份,可以恢复数据后几种类型的程序崩溃:

  • 操作系统崩溃

  • 断电

  • 文件系统崩溃

  • 硬件问题(硬盘、主板,等等)

示例命令不包括选项如--user--password对于mysqldumpMySQL客户端程序。你应该有这样的选项,使客户端程序连接到MySQL服务器。

假设数据是存储在InnoDB存储引擎,具有交易和自动故障恢复的支持。同时假设MySQL服务器在负载时的崩溃。如果不是,没有恢复的需要。

对于操作系统崩溃或断电的情况下,我们可以假设MySQL的磁盘数据可在重新启动。这个InnoDB数据文件可能不包含一致的数据,由于坠机,但InnoDB读取日志和他们的名单悬而未决的承诺和未提交的事务尚未刷新到数据文件中找到。InnoDB自动回滚未提交的事务,并刷新其数据文件的那些承诺。关于恢复过程的信息传送到用户通过MySQL错误日志。下面是一个示例日志摘录:

InnoDB:笪塔巴涩没有关闭normally.innodb:开始恢复日志文件…InnoDB:启动日志扫描基于检查点的日志序列号atinnodb:0 13674004innodb:做回收:扫描了日志序列号0 13739520innodb:做回收:扫描了日志序列号0 13805056innodb:做回收:扫描了日志序列号0 13870592innodb:做回收:扫描了日志序列号0 13936128…InnoDB:做回收:扫描了日志序列号0 20555264innodb:做回收:扫描了日志序列号0 20620800innodb:做回收:扫描了日志序列号0 20664692innodb:1未提交的事务(S)必须滚backinnodb:启动回滚回滚未提交的transactionsinnodb:TRX没有16745innodb:TRX没有16745 completedinnodb回卷:对未提交的事务回滚:completedinnodb开始申请批日志记录到数据库…InnoDB:申请批completedinnodb:startedmysqld:准备连接

对于文件系统崩溃或硬件问题的情况下,我们可以假设MySQL的磁盘数据可重启后。这意味着MySQL不能成功启动,因为磁盘数据块不再可读。在这种情况下,有必要重新格式化磁盘,安装一个新的,或不正确的问题。然后需要从备份中恢复我们的MySQL数据,这意味着备份必须已经做了。为了确保的情况下,一个备份策略的设计与实现。

7.3.1建立备份策略

是有用的,必须定期备份。一个完整的备份(在一个时间点的快照数据)可以在几个工具MySQL做。例如,MySQL企业备份可以执行物理备份一个完整的实例,以优化减少开销和避免倒车时InnoDB数据文件;mysqldump提供在线逻辑备份。讨论使用mysqldump

假设我们把我们所有的全备份InnoDB使用以下命令在星期日晚上1点,所有数据库中的表,当负荷低:

内核>mysqldump --all-databases --master-data --single-transaction > backup_sunday_1_PM.sql

由此产生的.sql文件由mysqldump包含一组SQLINSERT语句可以用来加载甩表在以后的时间。

这种备份操作获取所有表全局读锁在转储开始(使用FLUSH TABLES WITH READ LOCK)。只要这个锁已获得的二进制日志坐标读锁被释放。如果长时间的更新语句运行时FLUSH声明发出后,备份操作可能失速直到那些语句完成。之后,垃圾变成无锁和不打扰的读和写在桌子上。

这是假设前备份表InnoDB表,所以--single-transaction使用一个一致的阅读并保证数据被mysqldump不改变。(由其他客户的变化InnoDB表不见了mysqldump过程。)如果备份操作包括非事务表,一致要求他们不要在备份期间的变化。例如,对于MyISAM表中的MySQL数据库,必须在备份mysql帐户没有管理的变化。

数据备份是必要的,但它并不总是方便的创建。他们生产了大量的备份文件,需要时间来产生。他们不是最佳在这个意义上,每个连续的完整备份,包括所有的数据,甚至部分没有自上次完全备份了。更有效的是做一个初步的完整备份,然后进行增量备份。增量备份是较小的和生产需要更少的时间。权衡的是,在恢复的时间,你不能仅仅通过重装完整备份还原数据。你还必须处理增量备份恢复的增量变化。

做增量备份,我们需要保存的增量变化。在MySQL数据库中,这些变化是在二进制日志中的代表,所以MySQL服务器应该开始用--log-bin选项来启用日志。二进制日志功能,服务器写数据到一个文件的每一个变化而更新数据。看着一个MySQL服务器,并开始与数据目录--log-bin选择,已经运行了几天,我们发现这些MySQL二进制日志文件:

RW光碟——1月10 guilhem guilhem 1277324 23时59 gbichot2-bin.000001-rw-rw--- 1 guilhem guilhem 10 11月4日23时59 gbichot2-bin.000002-rw-rw--- guilhem guilhem 79 1 11 11:06 1 508 gbichot2-bin.000003-rw-rw--- guilhem guilhem 11 11 1 guilhem gbichot2-bin.000004-rw-rw---:08年11月12日16时47分guilhem 220047446 gbichot2-bin.000005-rw-rw--- -1 11月14日guilhem guilhem 998412 10 1 guilhem gbichot2-bin.000006-rw-rw---:08年11月14日10时07分guilhem gbichot2-bin.index 361

每次重新启动时,MySQL服务器使用序列中的下一个数创建一个新的二进制日志文件。当服务器在运行,你也可以告诉它关闭当前的二进制日志文件,并开始一个新的手动发布FLUSH LOGSSQL语句或一个mysqladmin刷新日志命令mysqldump也有一个选项来刷新日志。这个.index在数据目录文件包含所有MySQL二进制日志目录中的列表。

MySQL的二进制日志是重要的因为他们的形式恢复增量备份集。如果你一定要把日志当你把你的完整备份之后创建的二进制日志文件,包含所有的数据备份后所做的更改。让我们修改以前mysqldump命令一点让它刷新MySQL二进制日志的全备份的时刻,因此,转储文件包含新的当前的二进制日志的名称:

shell> mysqldump --single-transaction --flush-logs --master-data=2 \
         --all-databases > backup_sunday_1_PM.sql

执行此命令后,数据目录中包含一个新的二进制日志文件,gbichot2-bin.000007,因为--flush-logs选项使服务器刷新日志。这个--master-data选择的原因mysqldump写入二进制日志信息的输出,所以造成.sql转储文件包含这些线:

-- Position to start replication or point-in-time recovery from-- CHANGE MASTER TO MASTER_LOG_FILE='gbichot2-bin.000007',MASTER_LOG_POS=4;

因为mysqldump命令做了一个全备份,那些线意味着两件事:

  • 转储文件包含写入任何更改之前所做的所有更改gbichot2-bin.000007二进制日志文件或更高。

  • 所有的数据变化记录备份后不在转储文件存在,但存在于gbichot2-bin.000007二进制日志文件或更高。

星期一下午1点,我们可以通过刷新日志来开始一个新的二进制日志文件创建一个增量备份。例如,执行mysqladmin刷新日志命令创建gbichot2-bin.000008。星期日下午1点全备份和星期一下午1点之间的所有变化都会在gbichot2-bin.000007文件增量备份是很重要的,所以把它复制到一个安全的地方,是一个好主意。(例如,备份磁带或DVD,或复制到另一台机器。)星期二下午1时,执行另一个mysqladmin刷新日志命令。所有的变化在星期一下午1点和星期二下午1点会在gbichot2-bin.000008文件(这也应该被复制到一个安全的地方)。

MySQL的二进制日志占用磁盘空间。自由的空间,清除其中的时间。这样做的一个方法是删除不再需要的二进制日志,比如当我们做一个完整的备份:

shell> mysqldump --single-transaction --flush-logs --master-data=2 \
         --all-databases --delete-master-logs > backup_sunday_1_PM.sql
笔记

删除MySQL二进制日志mysqldump --删除主日志如果你的服务器是一个复制主服务器是危险的,因为从服务器可能没有完全处理的二进制日志的内容。为描述PURGE BINARY LOGS声明解释了什么是应验证删除MySQL二进制日志之前。看到第13.4.1.1,“清除二进制日志语法”

7.3.2使用备份恢复

现在,假设我们在8点需要恢复备份日灾难性的崩溃。恢复,首先恢复我们上次全备份(从日1点一)。完整备份文件是一组SQL语句,所以恢复很容易:

shell> mysql < backup_sunday_1_PM.sql

在这一点上,数据恢复其状态为主日下午1点。恢复了自那时以来的变化,我们必须使用增量备份;是的gbichot2-bin.000007Gbichot2-Bin.000008二进制日志文件。取文件如果需要从它们的备份,然后处理它们的内容这样:

shell> mysqlbinlog gbichot2-bin.000007 gbichot2-bin.000008 | mysql

我们现在已经恢复了数据的状态作为日下午一点,但仍然失踪,日期的变化到崩溃的日期。没有他们,我们就需要MySQL服务器存储MySQL二进制日志到一个安全的位置(磁盘、SAN、…)不同,它存储数据文件的地方,所以,这些记录是不被破坏的磁盘。(那是,我们可以用启动服务器--log-bin选项指定一个位置,在不同的物理设备上一个数据目录所在。这样,即使含有目录设备丢失的日志是安全的。)如果我们这样做,我们就gbichot2-bin.000009文件(以及随后的任何文件)在手,我们可以将它们使用mysqlbinlogMySQL在不损失了飞机坠毁的时候恢复最近的数据变化:

shell> mysqlbinlog gbichot2-bin.000009 ... | mysql

有关使用更多的信息mysqlbinlog处理二进制日志文件,看看7.5节,“时间点(增量)使用二进制日志恢复”

7.3.3备份策略总结

如果操作系统崩溃或断电,InnoDB本身所有的数据恢复工作。但要确保你能睡个好觉,遵循下列准则:

7.4使用mysqldump备份

本节介绍了如何使用mysqldump生成转储文件,以及如何加载转储文件。转储文件可以采用的几种方法:

  • 作为一个备份,使数据丢失情况下的数据恢复。

  • 作为一个用于设置数据源复制的奴隶。

  • 作为一个实验数据的来源:

    • 复制一个数据库,你可以使用而不改变原始数据。

    • 测试潜在的升级不兼容。

mysqldump产生的两种类型的输出,取决于--tab选择了:

  • 没有--tabmysqldump写SQL语句输出到标准输出。输出包括CREATE语句创建了对象(数据库、表、存储过程,等等),和插入语句将数据加载到表。输出可以保存在一个文件,重装后使用MySQL重新把对象。选项可以修改SQL语句的格式和控制的对象了。

  • --tabmysqldump产生每个甩表两输出文件。服务器写一个文件为制表符分隔的文本,每一行的表行。这个文件的名称tbl_name.txt在输出目录。服务器也发送一个CREATE TABLE为表表mysqldump写的,它作为一个文件名为tbl_name.sql在输出目录

7.4.1数据转储与mysqldump SQL格式

本节介绍了如何使用mysqldump创建SQL格式的转储文件。关于重装这样的转储文件的信息,参见7.4.2节,“重装SQL格式备份”

默认情况下,mysqldump将信息写入到标准输出的SQL语句。你可以在一个文件中保存输出:

shell> mysqldump [arguments] > file_name

把所有的数据库,调用mysqldump--all-databases选项

内核&#62;mysqldump --all-databases > dump.sql

将特定的数据库,他们的名字在命令行上使用--databases选项

内核&#62;mysqldump --databases db1 db2 db3 > dump.sql

这个--databases选项使所有的名字在命令行上被视为数据库名称。没有这个选项,mysqldump把名字作为数据库名称和表名称如下。

--all-databases--databasesmysqldumpCREATE DATABASEUSE到转储输出之前为每个数据库报表。这确保了当转储文件加载,它创建每个数据库,如果它不存在,使得它的默认数据库,数据库的内容加载到同一个数据库由他们来。如果你想使转储文件给力滴每个数据库之前创建它,使用--add-drop-database选项以及。在这种情况下,mysqldump写一个DROP DATABASE声明前每个CREATE DATABASE声明

把一个数据库,它的名字在命令行:

shell> mysqldump --databases test > dump.sql

在单一数据库的情况下,可以省略--databases选项

内核&#62;mysqldump test > dump.sql

前两个命令之间的区别是,没有--databases,转储输出不包含CREATE DATABASEUSE声明.这有几方面的含义:

  • 当你加载转储文件,您必须指定一个默认的数据库名称,数据库服务器知道重装。

  • 加载,你可以指定一个不同于原来的名称数据库名称,使你重新加载数据到一个不同的数据库。

  • 如果数据库重新加载不存在,你必须首先创建。

  • 由于输出将不包含CREATE DATABASE声明的--add-drop-database选项不起作用。如果你使用它,它不会产生DROP DATABASE声明

把特定的表从一个数据库中,他们的名字在命令行下面的数据库名称:

shell> mysqldump test t1 t3 t7 > dump.sql

7.4.2重装SQL格式备份

重载转储文件写的mysqldump由SQL语句,使用它作为输入的MySQL客户如果转储文件是由mysqldump--all-databases--databases选项,它包含CREATE DATABASEUSE报表,不必指定加载数据的默认数据库为:

内核&#62;mysql < dump.sql

另外,从内部MySQL,使用source命令:

MySQL的&#62;source dump.sql

如果文件是一个单一的数据库不包含CREATE DATABASEUSE报表,首先创建数据库(如果需要):

内核&#62;mysqladmin create db1

然后指定数据库名称,当你加载转储文件:

shell> mysql db1 < dump.sql

另外,从内部MySQL,创建数据库,选择它作为默认的数据库,并加载转储文件:

mysql> CREATE DATABASE IF NOT EXISTS db1;
mysql> USE db1;
mysql> source dump.sql
笔记

For Windows PowerShell users: Because the "<" character is reserved for future use in PowerShell, an alternative approach is required, such as using quotescmd.exe /c "mysql < dump.sql"

7.4.3倾销数据分隔符的文本格式,mysqldump

本节介绍了如何使用mysqldump创建带分隔符的文本转储文件。关于重装这样的转储文件的信息,参见第7.4.4,“重装分隔符的文本格式备份”

如果你调用mysqldump--tab=dir_name选项,它使用dir_name作为输出目录和转储表单独使用两个文件目录中的每个表。表名是这些文件的基名称。为表名T1文件的命名,t1.sqlTXTXT。这个.sql文件集装箱CREATE TABLE台词的语句。的txt文件包含数据的表,每个表行一行。

下面的命令转储的内容db1在对文件的数据库/tmp数据库:

shell> mysqldump --tab=/tmp db1

这个.txt包含表数据文件由服务器写的,所以他们所拥有的系统帐户用于运行服务器。服务器使用SELECT ... INTO OUTFILE写文件,所以你必须有FILE权限来执行此操作,而发生错误,如果一个给定的txt文件已经存在

服务器发送CREATE为把表定义mysqldump写他们,.sql文件这些文件是由谁执行,因此用户自备mysqldump

这是最好的,--tab只能用于倾销本地服务器。如果你使用一个远程服务器的--tab目录必须在本地和远程主机的存在,和txt文件将被写入远程目录服务器(服务器主机上),而.sql文件将被写入的mysqldump在本地目录(在客户端)。

mysqldump -表,默认情况下,服务器写数据到表.txt文件一行每行与列值的标签,没有引号的列值,作为行结束符和换行符。(这些都是相同的默认值为SELECT ... INTO OUTFILE。)

为了使数据文件被写入使用不同的格式,mysqldump支持这些选项:

这取决于你的任何这些选项指定的值,它可能需要在命令行中引用或逃避价值适当你的命令解释器。另外,用十六进制表示法指定的值。假设你想mysqldump引用列的值用双引号。这样做,说明双引号为价值--fields-enclosed-by选项但这种性格往往是特殊的命令,必须做特殊处理。例如,在UNIX系统下,你可以引用双引号这样:

--fields-enclosed-by='"'

在任何平台上,你可以在六指定值:

--fields-enclosed-by=0x22

这是通常使用的几种数据格式选项。例如,将表中的逗号分隔值格式线终止回车/换行符对(\r\n),使用该命令(进入这一行):

内核&#62;mysqldump --tab=/tmp --fields-terminated-by=,--fields-enclosed-by='"' --lines-terminated-by=0x0d0a db1

如果你使用任何的数据格式设置选项将表中的数据,你需要指定相同的格式,当你重新加载数据文件,确保文件内容的正确解读。

7.4.4重装分隔符的文本格式备份

备份产生的mysqldump -表,每个表是表示在输出目录中的一个.sql文件包含CREATE TABLE表的声明,和txt包含表数据文件。要加载一个表,首先改变位置到输出目录。然后过程.sql文件MySQL创建一个空的表和过程.txt文件加载数据到表:

内核&#62;mysql db1 < t1.sql内核&#62;mysqlimport db1 t1.txt

一个可选择使用mysqlimport加载数据文件使用LOAD DATA INFILE在声明MySQL客户:

mysql> USE db1;
mysql> LOAD DATA INFILE 't1.txt' INTO TABLE t1;

如果你用任何数据格格不入mysqldump当你开始把表,你必须使用相同的选项mysqlimportLOAD DATA INFILE为了保证数据文件内容的正确解读:

内核&#62;mysqlimport --fields-terminated-by=,--fields-enclosed-by='"' --lines-terminated-by=0x0d0a db1 t1.txt

mysql> USE db1;
mysql> LOAD DATA INFILE 't1.txt' INTO TABLE t1
    -> FIELDS TERMINATED BY ',' FIELDS ENCLOSED BY '"'
    -> LINES TERMINATED BY '\r\n';

7.4.5 mysqldump贴士

本部分调查技术,使您能够使用mysqldump解决具体问题:

  • 如何使一个数据库复制

  • 如何将数据库复制到另外一个服务器

  • 如何把程序存储(存储过程和函数、触发器和事件)

  • 如何把定义和数据分开

7.4.5.1复制的数据库

shell> mysqldump db1 > dump.sql
shell> mysqladmin create db2
shell> mysql db2 < dump.sql

不要使用--databasesmysqldump命令行因为这原因USE db1被包括在转储文件,它可以命名的影响db2MySQL命令行

7.4.5. 2数据库复制到另外一个服务器

1:1:

shell> mysqldump --databases db1 > dump.sql

复制转储文件从服务器1服务器2。

我们的服务器2:

shell> mysql < dump.sql

使用--databasesmysqldump命令行导致转储文件包括CREATE DATABASEUSE语句创建数据库,如果它确实存在,使它的加载数据的默认数据库。

或者,你可以省略--databasesmysqldump命令。然后,您将需要创建在服务器2数据库(如果需要)和指定为默认数据库,当你加载转储文件。

1:1:

shell> mysqldump db1 > dump.sql

我们的服务器2:

shell> mysqladmin create db1
shell> mysql db1 < dump.sql

在这种情况下,你可以指定一个不同的数据库名称,所以省略--databasesmysqldump命令使您能够把数据从一个数据库加载到另一个。

7.4.5.3倾销的存储程序

Sseveral options control control howmysqldump处理程序存储(存储过程、函数、触发器和事件):

这个--triggers选项是默认启用的,当表被甩了,他们是伴随着他们的任何触发器。其他选项默认是关闭的,必须明确指定将相应的对象。禁用这些选项的任何显式,利用其跳跃形式:--skip-events--skip-routines,或--skip-triggers

7.4.5.4倾销表的定义和内容分开

这个--no-data选项告诉mysqldump不把表中的数据,从而只包含语句创建表转储文件。相反,该--no-create-info选项告诉mysqldump抑制CREATE从报表输出,使转储文件只包含表数据。

例如,将表定义和数据分别为test数据库,使用这些命令:

内核&#62;mysqldump --no-data test > dump-defs.sql内核&#62;mysqldump --no-create-info test > dump-data.sql

一个定义只转储,加--routines--events选项还包括存储程序和事件的定义:

内核&#62;mysqldump --no-data --routines --events test > dump-defs.sql

7.4.5.5使用mysqldump升级兼容性测试

当考虑一个MySQL升级,明智的做法是分别从你当前的生产版本安装更新版本。然后你可以把数据库和数据库对象的定义,从生产服务器和负载到新服务器是否处理得当。(这也是有用的测试降级。)

在生产服务器:

shell> mysqldump --all-databases --no-data --routines --events > dump-defs.sql

在升级服务器:

shell> mysql < dump-defs.sql

因为转储文件不包含表数据,可快速处理。这使您能够发现潜在的不兼容,无需等待漫长的数据加载操作。寻找警告或错误时转储文件被处理。

当你已经验证的定义是正确的处理,数据的转储和尝试加载到升级服务器。

在生产服务器:

shell> mysqldump --all-databases --no-create-info > dump-data.sql

在升级服务器:

shell> mysql < dump-data.sql

现在检查表的内容和运行一些测试查询。

在时间7.5点(增量)使用二进制日志恢复

从一个给定的时间点,在时间的恢复是指恢复数据点的变化。通常情况下,这种复苏是恢复完整备份带来的服务器状态时备份了后进行。(完整备份可以在几个方面,如那些列在2节,“数据库备份方法。)时间点恢复提出服务器目前逐步从完整备份的时间更近的时间。

笔记

这里的许多实例使用MySQL客户端进程产生的二进制日志输出mysqlbinlog。如果你的二进制日志包含\0(空)字符,输出不能解析MySQL除非你使用--binary-mode选项

时间点恢复是基于这些原则:

  • 在时间点恢复信息的来源是由二进制日志文件为代表的增量备份集生成完整备份操作之后。因此,必须启动服务器的--log-bin选项可启用二进制日志(见5.4.4节,“二进制日志”

    从二进制日志恢复数据,你必须知道的名称和当前的二进制日志文件的位置。默认情况下,服务器在数据目录中创建的二进制日志文件,但可以指定的路径名--log-bin选择将文件放置在不同的位置。5.4.4节,“二进制日志”

    看到所有的二进制日志文件列表,使用此语句:

    mysql> SHOW BINARY LOGS;
    

    确定当前的二进制日志文件的名称,发表如下声明:

    mysql> SHOW MASTER STATUS;
    
  • 这个mysqlbinlog效用的事件在二进制日志文件的二进制格式的文本,他们可以执行或视。mysqlbinlog有选择的基于事件的时间或位置的事件日志内的二进制日志中的部分选项。看到4.6.8“,”mysqlbinlog用于处理二进制日志文件实用程序”

  • 从二进制日志执行事件引起的数据修改,他们表示要重做。这使得对于一个给定的时间内恢复数据的变化。从二进制日志执行事件过程mysqlbinlog输出使用MySQL客户:

    shell> mysqlbinlog binlog_files | mysql -u root -p
    
  • 查看日志的内容可以是有用的当你需要确定事件的时间或位置选择部分日志的内容来执行事件之前。从日志查看事件,发送mysqlbinlog输出到一个分页程序:

    shell> mysqlbinlog binlog_files | more
    

    另外,在文件输出保存在文本编辑器中查看文件:

    shell> mysqlbinlog binlog_files > tmpfile
    shell> ... edit tmpfile ...
    
  • 在文件保存输出的是一个有用的初步执行日志内容与某些事件删除,如一个偶然DROP DATABASE。你可以删除的文件不能执行其内容之前执行任何语句。编辑后的文件,为执行内容:

    内核&#62;mysql -u root -p < tmpfile

如果你有一个以上的二进制日志在MySQL服务器上执行的,安全的方法都使用一个连接到服务器。这里有一个例子,说明什么是不安全的

shell> mysqlbinlog binlog.000001 | mysql -u root -p # DANGER!!
shell> mysqlbinlog binlog.000002 | mysql -u root -p # DANGER!!

处理二进制日志这种方式使用不同的服务器的连接问题的原因,如果第一个日志文件包含CREATE TEMPORARY TABLE表和二日志包含声明使用临时表。当第一MySQL进程终止,服务器滴临时表。当第二MySQL使用过程中尝试,服务器报告未知的表

为了避免这样的问题,使用单身连接执行要处理所有的二进制日志的内容。这里是这样做的一个方法:

shell> mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p

另一个方法是写的所有日志到一个单一的文件然后处理文件:

shell> mysqlbinlog binlog.000001 >  /tmp/statements.sql
shell> mysqlbinlog binlog.000002 >> /tmp/statements.sql
shell> mysql -u root -p -e "source /tmp/statements.sql"

当写入转储文件阅读时从一个二进制日志包含gtids回来(见部分下面,“复制与全球事务标识符”),使用--skip-gtids选项mysqlbinlog,像这样:

shell> mysqlbinlog --skip-gtids binlog.000001 >  /tmp/dump.sql
shell> mysqlbinlog --skip-gtids binlog.000002 >> /tmp/dump.sql
shell> mysql -u root -p -e "source /tmp/dump.sql"

在使用事件的时间点恢复7.5.1

表示开始和结束的时候恢复,指定--start-datetime--stop-datetime选项mysqlbinlog,在DATETIME格式作为一个例子,假设是在2005年4月20日上午十点SQL语句被执行,删除一个大表。恢复表和数据,你可以恢复以前的备份,然后执行下面的命令:

内核&#62;mysqlbinlog --stop-datetime="2005-04-20 9:59:59" \/var/log/mysql/bin.123456 | mysql -u root -p

此命令恢复所有数据截至日期和时间的--stop-datetime选项如果你没有检测到错误的SQL语句,进入到几个小时后,你可能也想要恢复,随后发生的活动。在此基础上,你可以运行mysqlbinlog一开始的日期和时间,像这样:

shell> mysqlbinlog --start-datetime="2005-04-20 10:01:00" \
         /var/log/mysql/bin.123456 | mysql -u root -p

在这个命令,SQL语句记录从10:01上午将重新执行。对前一晚的转储文件和两个恢复相结合mysqlbinlog命令恢复一切直到前一秒10:00从10:01点。

利用这个时间点恢复的方法,你应该检查日志以确保准确的时间到指定的命令。显示日志文件内容不执行,使用此命令:

shell> mysqlbinlog /var/log/mysql/bin.123456 > /tmp/mysql_restore.sql

然后打开/tmp/mysql_restore.sql用文本编辑器查看文件。

不包括具体的变化,通过指定的时间mysqlbinlog如果没有多个语句执行时间为一个同样被排除在外的工作。

在使用事件位置的时间点恢复7.5.2

而不是指定日期和时间的--start-position--stop-position选项mysqlbinlog可用于指定日志的位置。他们工作的同时,为开始和停止日期选项,除非您指定的日志位置编号而不是日期。使用位置可以使你更精确的关于这部分的日志恢复,尤其是许多交易发生时间为有害的SQL语句相同。确定位置的数字,跑mysqlbinlog一个时间范围附近的时候,不必要的交易被执行死刑,但重定向结果检查文本文件。这是可以做到的那样:

shell> mysqlbinlog --start-datetime="2005-04-20 9:55:00" \
         --stop-datetime="2005-04-20 10:05:00" \
         /var/log/mysql/bin.123456 > /tmp/mysql_restore.sql

这个命令创建一个小的文本文件/tmp目录包含SQL语句的时候,有害的SQL语句被执行。用文本编辑器打开此文件,并寻找的声明,你不想重复。决定停止和恢复恢复的二进制日志的位置,记下他们。位置标记为log_pos其次是一些。恢复以前的备份文件后,使用位置编号处理二进制日志文件。例如,你可以使用命令这样的东西:

shell> mysqlbinlog --stop-position=368312 /var/log/mysql/bin.123456 \
         | mysql -u root -p

shell> mysqlbinlog --start-position=368315 /var/log/mysql/bin.123456 \
         | mysql -u root -p

第一个命令恢复所有的交易,直到停止位置了。第二命令恢复所有交易从开始位置到二进制日志的结尾。因为输出mysqlbinlog包括SET TIMESTAMP在每个SQL语句记录报表,恢复的数据和相关的MySQL日志将反映原始时代的交易执行。

7.6 MyISAM表的维护和故障恢复

本节介绍如何使用myisamchk检查或修理MyISAMTable(Table that have that have)MVD.MYI文件储存数据和指标)。将军myisamchk背景,看4.6.4“,”myisamchk- MyISAM表维护工具”。其他修表的信息可以找到第2.10.3,“重建或修复表或索引”

你可以使用myisamchk检查,修复或优化的数据库表。以下各节描述如何执行这些操作,如何建立一个表的维护计划。有关使用myisamchk得到关于你的表的信息,参见第4.6.4.5,“获得myisamchk”表信息

即使表修复myisamchk是非常安全的,它做一个备份是一个不错的主意之前做一个修理或维护操作,可以使大量的表的变化。

myisamchk影响指标的操作可能会导致MyISAM全文指标应与全文的参数都是由MySQL服务器使用的价值观不相容。为了避免这个问题,遵循指南第4.6.4.1,“myisamchk一般选项”

MyISAM表的维护也可以使用SQL语句执行的操作类似于什么myisamchk能做的:

关于这些语句的更多信息,参见第13.7.3,“表维护报表”

这些语句可以直接使用或通过的mysqlcheck客户端程序。一个利用这些陈述myisamchk是服务器做所有的工作。与myisamchk,您必须确保服务器不在同一时间,因此不存在之间不必要的交互使用的表myisamchk和服务器

7.6.1用于崩溃恢复myisamchk

本节描述如何检查与MySQL数据库数据损坏的处理。如果你的表会损坏频繁,你应该尝试找出原因。看到第b.5.3.3,“做什么如果MySQL总是死机”

一个说明MyISAM表可以被损坏,看第16.2.4,“MyISAM表的问题”

如果你运行mysqld与外部锁定残疾(这是默认的),你不能可靠地使用myisamchk检查表的时候mysqld使用相同的表。如果你可以肯定的是,没有人会通过访问表mysqld当你运行myisamchk,你只需要执行mysqladmin flush-tables在你开始之前检查表。如果你不能保证,你必须停止mysqld当你检查表。如果你运行myisamchk检查表mysqld更新的同时,你可能会得到一个警告,一个表被破坏甚至是不。

如果服务器运行外部锁定功能,您可以使用myisamchk随时检查表。在这种情况下,如果服务器试图更新一个表,myisamchk是以,服务器将等待myisamchk然后再继续完成

如果你使用myisamchk修复或优化的表,你必须始终确保mysqld服务器不使用表(如果外部锁定功能这也适用)。如果你不停止mysqld,你至少应该做的mysqladmin flush-tables在你运行myisamchk。你的表可能会损坏如果服务器和myisamchk访问表

执行崩溃恢复时,这是为了了解每个重要MyISAMtbl_name在一个数据库中对应于下表中显示的数据库目录的文件。

文件目的
tbl_name.MYD数据文件
tbl_name.MYI索引文件

这三个文件类型是受各种腐败问题,但最常发生在数据文件和索引文件。

myisamchk通过创建一个复制的作品.MYD一排排的数据文件。结束维修阶段,将旧的MVD重命名文件,新文件的原文件名。如果你使用--quickmyisamchk不创建一个临时的.MYD文件,而假设MVD文件是正确的,只产生一个新的索引文件,不碰.MYD文件这是安全的,因为myisamchk自动检测.MYD文件已损坏,中止修复如果是。你也可以指定--quick选择两次myisamchk。在这种情况下,myisamchk不放弃对一些错误(如重复键错误)而是试图解决通过修改.MYD文件通常使用两--quick如果你有太多的空闲磁盘空间进行正常的修复选项是有用的。在这种情况下,你至少应该在跑步前作表的备份myisamchk

7.6.2如何检查MyISAM表错误

检查MyISAM表,使用下面的命令:

  • myisamchktbl_name

    这一发现99.99%的所有错误。它不能发现腐败,涉及只有数据文件(这是很不寻常的)。如果你想检查一个表,你应该正常运行myisamchk没有选择或与-s(silent)选择。

  • myisamchk Mtbl_name

    这一发现达所有的错误。它首先检查所有的错误索引条目然后读取所有的行。它计算出的行的所有关键值校验和验证校验和匹配的索引树的密钥校验。

  • myisamchk -tbl_name

    这是一个完整的和彻底的检查(所有数据-e方法延伸检查)。它会检查每一个关键读每一行来验证他们确实指向正确的行。这可能需要一个大的表,有很多指标很长时间。通常,myisamchk站在第一个错误发现。如果你想获得更多的信息,你可以添加-v(罗嗦)选项。这原因myisamchk继续前进,通过最多20个错误。

  • myisamchk -和-tbl_name

    这是像以前的命令,但-i选项告诉myisamchk打印额外的统计信息

在大多数情况下,一个简单的myisamchk不带参数比其他的表名的命令是足够的检查表。

7.6.3如何修复MyISAM表

本节的讨论描述如何使用myisamchk打开(放)MyISAM排气表。我.MYD

你也可以使用CHECK TABLEREPAIR TABLE语句来检查和修复MyISAM表看到第13.7.3.2,“检查表语法”,和第13.7.3.5,修表的语法”

损坏的表症状包括查询终止意外和观察到的像这样的错误:

  • 找不到文件tbl_name.MYI(errcode:nnn

  • 意外的文件结束

  • 记录文件是坠毁

  • 有错误nnn从表处理程序

要获得有关错误的更多信息,运行perrornnn,在那里nnn是错误数。下面的示例演示如何使用perror为最常见的错误编号表明一个表的问题找到意义:

shell> perror 126 127 132 134 135 136 141 144 145
MySQL error code 126 = Index file is crashed
MySQL error code 127 = Record-file is crashed
MySQL error code 132 = Old database file
MySQL error code 134 = Record was already deleted (or record file crashed)
MySQL error code 135 = No more room in record file
MySQL error code 136 = No more room in index file
MySQL error code 141 = Duplicate unique key or constraint on write or update
MySQL error code 144 = Table is crashed and last repair failed
MySQL error code 145 = Table was marked as crashed and should be repaired

请注意,错误135(记录文件没有更多的空间)和错误136(索引文件中没有更多的空间)是不是可以用一个简单的修复固定误差。在这种情况下,你必须使用ALTER TABLE增加max_rowsAVG_ROW_LENGTH表选项值:

修改表tbl_nameMAX_ROWS=xxxAVG_ROW_LENGTH=yyy

如果你不知道当前表的选项值,使用SHOW CREATE TABLE

对于其他的错误,你要修你的表。myisamchk通常可以检测和修复大多数问题的发生。

维修过程中涉及到的三个阶段,这里描述的。在你开始之前,你应该改变位置数据库目录和文件的权限检查表。在Unix上,确保它们的用户可读mysqld运行(与你,因为你需要访问你检查文件)。如果你发现需要修改的文件,他们也必须由你写。

本节为例表检查失败(如所描述的那些第7.6.2,“如何检查错误”MyISAM表),或者你想使用的扩展功能myisamchk提供.

这个myisamchk用于表的维护与选择了4.6.4“,”myisamchk- MyISAM表维护工具”myisamchk也有变量,您可以设置控制内存分配,可以提高性能。看到部分4.6.4.6,“myisamchk内存使用”

如果你要从命令行修表,你必须先停止mysqld服务器注意,当你做关闭在远程服务器上,这mysqld服务器还提供了一会儿后mysqladmin返回,直到所有的语句处理已停止所有指标的变化已经刷新到磁盘。

实习1:抓住你的桌子

运行myisamchk *。我myisamchk - E *。我如果你有更多的时间。使用-s(沉默)可以抑制不必要的信息。

如果mysqld服务器停止,你应该使用--update-state选项告诉myisamchk为了纪念表选中的.

你要修表,只有那些myisamchk宣布一个错误。这样的表,进行2阶段。

如果你得到意想不到的错误检查时(如out of memory错误),或如果myisamchk崩溃,去3期

第二阶段:简单安全的修复

首先,尝试myisamchk R Qtbl_name·R·Q方法快速恢复模式)。本文试图索引文件的修复不接触数据文件。如果数据文件包含要一切和删除连接点在正确的位置的数据文件,这应该和桌子是固定的。开始修理下表。否则,使用下面的过程:

  1. 在继续之前,使数据文件备份。

  2. 使用myisamchk - R的tbl_nameR方法恢复模式)。这消除了不正确的行和删除行的数据文件并重建索引文件。

  3. 如果前面的步骤失败,使用myisamchk --安全恢复tbl_name。安全恢复模式使用一个老的回收方法处理几例,定期回收模式不(但速度较慢)。

笔记

如果你想要一个手术修补,走得多快,你应该设置的值sort_buffer_sizekey_buffer_size每个变量对你25%的可用内存运行时myisamchk

如果你得到意想不到的错误修复时(如out of memory错误),或如果myisamchk崩溃,去3期

阶段3:维修困难

你应该只有在索引文件中的第一16kb块破坏或包含不正确的信息,达到这个阶段,或者如果索引文件丢失。在这种情况下,有必要建立一个新的索引文件。这样做如下:

  1. 移动数据文件到一个安全的地方。

  2. 使用表描述文件创建新的(空的)数据和索引文件:

    shell> mysql db_name
    
    MySQL的&#62;SET autocommit=1;MySQL的&#62;TRUNCATE TABLE tbl_name;MySQL的&#62;quit
  3. 复制旧的数据文件到新创建的数据文件。(不要把旧的文件到新文件。你想在出差错的情况下保留副本。)

重要

如果您使用的是复制,你应该执行上述步骤之前阻止它,因为它涉及到文件系统的操作,这些都没有登录MySQL。

回到阶段2myisamchk R Q要工作。(这不应该是一个永无止境的循环。)

你也可以使用REPAIR TABLE tbl_name USE_FRMSQL语句,执行全过程自动。也有不可能的效用和服务器之间不必要的交互,因为服务器做所有的工作,当你使用REPAIR TABLE。看到第13.7.3.5,修表的语法”

美国MyISAM表优化

凝聚分散的行和消除浪费的空间删除或更新行,结果,跑myisamchk在恢复模式:

shell> myisamchk -r tbl_name

你可以优化在同一方式表用OPTIMIZE TABLESQL语句OPTIMIZE TABLE一个修表和重点分析,并分类索引树,重点查找更快。也有不可能的效用和服务器之间不必要的交互,因为服务器做所有的工作,当你使用OPTIMIZE TABLE。看到第13.7.3.4,“优化表语法”

myisamchk还有一些其他的选项,你可以使用一个表的性能提高:

  • --analyze-在:执行密钥分布分析。这提高了使优化器更好的选择加入的顺序加入表,应该使用哪个指标和性能。

  • --sort-indexS:索引块排序。这优化了寻求进行表扫描,使用索引更快。

  • --sort-records=index_num- Rindex_num排序的数据行:根据给定的索引。这使您的数据更本地化,可以加快基于范围SELECT顺序操作,利用这一指标

为了充分说明所有可用的选项,看4.6.4“,”myisamchk- MyISAM表维护工具”

7.6.5建立MyISAM表的维护计划

这是一个好主意来执行表检查定期的基础上,而不是等待问题发生。检查和修复的一种方法MyISAM表与CHECK TABLEREPAIR TABLE声明.看到第13.7.3,“表维护报表”

另一种方法是使用检查表myisamchk。为了维护的目的,你可以使用myisamchk S。这个-s选择(短裤)--silent原因myisamchk运行在静音模式,打印邮件时发生错误。

它使自动也是一个好主意MyISAM检查表。例如,当机器做了重新启动在更新中,你通常需要检查每个表可能已经在使用前进一步的影响。(这些都是预计撞表)导致服务器检查MyISAM表格自动的开始--myisam-recover-options选项看到第5.1.6、“服务器选项”

您还应该检查你的表经常在正常的系统操作。例如,您可以运行一个cron工作检查的重要表,每周一次,在使用这样的线crontab文件:

35 * 0 * 0/path/to/myisamchk-快-沉默/path/to/datadir/ * / *。我

这种打印出的信息撞表使您可以检查和修复是必要的。

首先,执行myisamchk S在所有的表已经在过去的24小时内更新每个夜晚。你看,问题不常发生,你可以回去检查频率为一星期左右一次。

通常情况下,MySQL表需要很少的维护。如果您正在执行更新MyISAM表动态大小的行(表VARCHARBLOB,或TEXT柱)或有许多已删除的行你可能想整理/回收空间从表时表。您可以通过使用OPTIMIZE TABLE对问题的表。或者,如果你能停止mysqld一时间服务器,更改位置到数据目录,当服务器停止使用此命令:

shell> myisamchk -r -s --sort-index --myisam_sort_buffer_size=16M */*.MYI