本章要点:数据库目录的内容如何备份和恢复数据如何使用日志如何使用内建复制有多种可能会导致数据表的丢失或者服务器的崩溃,一个简单的DROPTABLE或者DROPDATABASE的语句,就会让你的数据表化为乌有。更危险的是DELETE*FROMtbl_name,可以轻易的清空你的数据表,而这样的错误是很容易的发生的。因此,拥有能够恢复的数据对于一个数据库系统来说是非常重要的。一般的说,MySQL有三种保证数据安全的方法:常规日志和更新日志通过保存执行的查询供你必要时恢复数据库备份通过导出数据或者表文件的拷贝来保护数据数据库复制MySQL内部复制功能是建立在两个或两个以上服务器之间,通过设定它们之间的主-从关系来实现的。其中一个作为主服务器,其它的作为从服务器。这个复制功能是在3.23.15版以后才有的数数数据据据库库库的的的备备备份份份与与与恢恢恢复复复第第55章章5数据库的备份与恢复数据库服务器存放数据文件的地方,不仅包括有关表的文件,还包括数据文件和MySQL的服务器选项文件。不同的分发,数据库目录的缺省位置是不同的。5.1.1数据目录的位置缺省的数据库位置缺省数据库的位置编译在服务器中。1、如果您是在一个源程序分发包中安装MySQL,典型的缺省位置可能是/usr/local/var;2、如果在二进制分发包中安装MySQL,则为/usr/local/mysql/data;3、在RPM文件中安装,为/var/lib/mysql。4、对于windwos平台上的分发,其位置时BASEDIR\data数据目录的位置可以在启动服务器时通过--datadir=/path/to/dir明确地指定。如果您想将数据目录放置在其他地方而非缺省的位置,则这个选项是有用的。了解数据库目录的位置作为一名MySQL管理员,您应该知道数据目录在哪里。如果运行多个服务器,那么您应该掌握所有数据目录的位置。但是,如果不知道目录的位置(或许您正在代替前一位管理员,而他留下的记录很糟糕),有几种方法可以用来查找它:1、可使用mysqladmin变量直接从服务器中得到数据目录路径名。在UNIX中,输出结果类似于如下所示:$mysqladminvariables+-------------------------+---------------------------|Variable_name|Value+-------------------------+---------------------------|ansi_mode|OFF|back_log|50|basedir|/var/local|connect_timeout|5|concurrent_insert|ON|datadir|/usr/local/var该输出结果指明了服务器主机中数据目录的位置/usr/local/var。在Windows中,输出结果类似于如下所示:c:\mysql\binmysqladminvariables+-------------------------+---------------------------|Variable_name|ValueMySQL金典培训教程116|ansi_mode|OFF|back_log|50|basedir|c:\mysql\|connect_timeout|5|concurrent_insert|ON|datadir|c:\mysql\data\如果正在运行多个服务器,它们将监听不同的TCP/IP端口号和套接字。可以通过提供合适的--port或--socket选项连接到每个服务器监听的端口和套接字上:$mysqladmin–port=port=port_numvariables$mysqladmin–socket=/path/to/socketvariablesmysqladmin命令可在您连接服务器的任何一台主机上运行。如果需要连接到远程主机上的服务器,则使用--host=host_name选项:$mysqladmin–host=host_namevaribles2、在Unix平台上,可使用ps来查看任何当前执行mysql进程的命令行。试一试下列的命令(根据您的系统所支持的ps版本)并查找显示在输出结果中的这些命令的--datadir:$psau|grepmysqld如果系统运行多个服务器(因为一次发现了多个数据目录位置),则ps命令将会特别有用。它的缺点是:ps必须运行在服务器的主机上,并且除非--datadir选项在mysqld命令行中明确指定,否则将产生无用的信息。3、如果MySQL从源程序分发包中安装,可以检查其配置信息以确定数据目录的位置。例如,在最高级的Makefile中该位置是可用的。但是,要小心:位置是Makefile中的变量localstatedir的值,而不是datadir的值。同样,如果分发包定位在NFS装配文件系统中,并且是用于为几个主机建立MySQL的,则配置信息反映最近建立分发包的主机。它可能不显示您感兴趣的主机的数据目录。4、如果前面的任何方法都不成功,可使用find搜索数据库文件。下列命令将搜索.frm(描述)文件,它是MySQL安装程序的组成部分:$find/-name“*.frm”–print在windows平台上的搜索非常简单,本节就不给出例子了。在本章的这些例子中,笔者将MySQL数据目录的位置表示为DATADIR。您可以将其解释成为您自己的机器中的数据目录的位置。5.1.2数据库的表示法由MySQL管理的每个数据库都有自己的数据库目录,它们是数据目录的子目录,与所表示的数据库有相同的名称。例如,数据库my_db对应于数据库目录DATADIR/my_db。5数据库的备份与恢复这个表示法使得几个数据库级的语句的实现是非常容易的。CREATEDATABASEdb_name使用只允许对MySQL服务器用户(服务器运行的UNIX用户)进行访问的所有权和方式,并在数据目录中创建一个空目录db_name。这等价于以服务器主机中的服务器用户的身份通过执行下列命令手工创建数据库:$mkdirDATADIR/db_name创建数据库目录$chmod700DATADIR/db_name使它仅对MySQL服务器用户可访问通过空目录表示新数据库的方法与其他数据库系统完全不同,那些数据库系统甚至要为“空”数据库创建许多控制文件或系统文件。DROPDATABASE语句也很容易实现。DROPDATABASEdb_name删除数据目录中的db_name目录以及其中的所有表文件。这个语句类似于下列命令:$rm-rfDATADIR/db_name其区别是,服务器只删除带有表的扩展名的文件。如果已经在该数据库目录中创建了其他的文件,服务器将使它们保持完整,并且不删除该目录本身。SHOWDATABASE只不过是对应位于数据目录中的子目录名称的一个列表。有些数据库系统需要保留一个列出所有需要维护的数据库的主表,但是,在MySQL中没有这样的结构。由于数据目录结构的简单性,数据库的列表是隐含在该数据目录的内容中的,像主表这样的表可能会引起不必要的开销。5.1.3数据库表的表示法数据库中的每个表在数据库目录中都作为三个文件存在:一个格式(描述)文件、一个数据文件和一个索引文件。每个文件的基名是该表名,扩展名指明该文件的类型。扩展名如表5-1所示。数据和索引文件的扩展名指明该表是否使用较老的ISAM索引或较新的MyISAM索引。表5-1MySQL文件类型文件类型文件扩展名文件内容格式文件.frm描述表的结构(列、列类型、索引,等等)数据文件.ISD(ISAM)或.MYD(MyISAM)包含表的数据─即它的行索引文件ISD(ISAM)或.MYI(MyISAM)包含数据文件中任何索引的索引树。无论该表有无索引,索引文件都存在当发布定义一个表结构的CREATETABLEtbl_name语句时,服务器创建tbl_name.frm文件,它包含该结构的内部编码。该语句还创建空的数据文件和索引文件,这些文件的初始信息表明没有记录和索引(如果CREATETABLE语句包含索引说明,则该索引文件将反映这些索引)。描述表的文件的所有权和方式被设置为只允许对MySQL服务器用户的访问。当发布ALTERTABLE语句时,服务器对tbl_name.frm重新编码并修改数据文件和索引文件的内容以反映由该语句表明的结构变化。对于CREATE和DROPINDEX也是MySQL金典培训教程118如此,因为服务器认为它们等价于ALTERTABLE语句。DROPTABLE删除代表该表的三个文件。尽管可以通过删除数据库目录中的对应某个表的三个文件来删除该表,但不能手工创建或更改表。例如,如果my_db是当前的数据库,DROPTABLEmy_tbl大致等价于下列命令:来自于SHOWTABLESmy_db的输出结果正是my_db数据库目录中.frm文件基名的一个列表。某些数据库系统维护一个列出了数据库中的所有表的登记。但MySQL不这样做,因为没有必要,这个“登记”隐含在了数据目录的结构中。5.1.4MySQL的状态文件除数据库目录外,MySQL数据目录还包含许多状态文件。表10-3概括介绍了这些文件。大多数状态文件的缺省名称从服务器主机名字中生成,在此表中表示为HOSTNAME。表5-2MySQL状态文件文件类型缺省名文件内容进程IDHOSTNAME.pid服务器进程ID错误日志HOSTNAME.err启动和关闭事件和错误状态常规日志HOSTNAME.log连接/断开事件和查询信息更新日志HOSTNAME.nnn修改表的内容或结构的所有查询的文本服务器在启动时将它的进程ID(PID)写入PID文件,并在关闭时删除该文件。PID文件是一种方法,用这种方法,其他的进程可以找到该服务器。例如,如果您在系统关闭时运行mysql.server脚本来关闭MySQL服务器,则该脚本将检查PID文件以确定它需要哪个进程来发送一个终止信号。错误日志由safe_mysqld产生,作为服务器标准错误输出结果的重定向,它包含服务器写入stderr的所有消息。这意味着仅当通过调用safe_mysqld启动服务器时,错误日志才存在(总之,这是启动服务器的首选方法,因为,如果由于一个错误使错误日志存在,则safe_mysqld将重新启动服务器)。常规日志和更新日志是可选的,可以用--log和--log-update服务器选项开启需要的日志类型。常规进程提供有关服务器运作的常规信息:谁从哪里进行了连接,以及他们发布了什么查询。更新日志也提供查询信息,但仅仅是修改过的数据库内容的查询信息。更新日志的内容是一些SQL语句,这些语句可以通过将它们输入到mysql客户机程序来运行。如果出现崩溃且必须转到备份文件时,更新日志将是有用的,因为您能够通过将更新日志输入到服务器来重复这些自崩溃以来所完成的更新操作。这将使得数据库恢复到崩溃发生时所处的状态上。下面是一个实例,它是作为一个短客户机会话的结果出现在常规日志中的信息中5数据库的备份与恢复的,这个会话在test数据库中从mytest.pet复制一个表,并插入一行到该表中,然后删除该表:01020623:08:213Connectroot@localhoston01020623:09:073InitDBtest01020623:09:363Querycreatetablemytestselect*frompet01020623:09:433Query