做网站用什么格式的图片,个人官方网站怎么建设,睢宁县建设工程招标网,龙岩关键词优化排名适用于#xff1a;MySQL服务器版本4.1到5.6 [发行版4.1到5.6]本文信息适用于所有平台。目标如何使用undrop for innodb从损坏的表中提取数据解决方案使用工具有时可能从无法用innodb_force_recovery读取的表中恢复数据。undrop可以直接读取数据库的ibdata1文件#xff0c;来获…适用于MySQL服务器版本4.1到5.6 [发行版4.1到5.6]本文信息适用于所有平台。目标如何使用undrop for innodb从损坏的表中提取数据解决方案使用工具有时可能从无法用innodb_force_recovery读取的表中恢复数据。undrop可以直接读取数据库的ibdata1文件来获取数据字典信息和必要的恢复信息。通常该工具从整个(多个)ibdata文件且/或独立的InnoDB tablespace文件 (innodb_file_per_table在使用中的.ibd文件)提取索引页。Blob页被提取到可应用的另外的子目录一旦数据被提取到索引页下一步就是从数据目录恢复主键或一般聚类索引ID然后将数据提取到适于使用LOAD DATA INFILE的文件。如果可以的话以要恢复的(多个)数据库的至少一个schema dump启动需要时使用innodb_force_recovery。即使一个过时的备份也好过什么都没有。虽然UnDROP有时能从ibdata文件中提取一个有效表定义它不擅于处理所有列类型。如果你完全没有备份.frm文件能被用于重建表定义。如果你没有任何备份或.frm文件那么最后一招就是UnDROP 能从idbata提取的表定义能尝试至少恢复一些数据。首先stream_parser是用于从ibdata提取页的工具。它的使用很简单./stream_parser -f 页会被默认提取到”pages-”。索引页被储存在子目录FIL_PAGE_INDEX且blob页被储存在子目录FIL_PAGE_TYPE_BLOB。要提取表的所有数据有必要识别表的主键的数据目录索引ID (在没有主键时的一般索引)。这能通过使用UnDROP工具的”recover_dictionary.sh”脚本将从被提取的索引页提取的字典数据放到在运行服务器的’test’ schema像这样$ ./recover_dictionary.shGenerating dictionary tables dumps... OKCreating test database ... OKCreating dictionary tables in database test:SYS_TABLES ... OKSYS_COLUMNS ... OKSYS_INDEXES ... OKSYS_FIELDS ... OKAll OKLoading dictionary tables data:SYS_TABLES ... 1845 recs OKSYS_COLUMNS ... 22029 recs OKSYS_INDEXES ... 4994 recs OKSYS_FIELDS ... 6070 recs OKAll OK现在字典能被查询来找出索引相对于任何给定表的索引ID。给出的示例是对于在moodle2 schema中的表mdl2_usermysql SELECT SYS_TABLES.NAME TABLE_NAME, SYS_TABLES.ID TABLE_ID,SYS_INDEXES.NAME INDEX_NAME, SYS_INDEXES.ID INDEX_ID FROM SYS_TABLES LEFT JOINSYS_INDEXES ON SYS_TABLES.ID SYS_INDEXES.TABLE_ID WHERE SYS_INDEXES.NAME LIKE %PRIMARY% AND SYS_TABLES.NAME LIKE moodle2/mdl2_user AND SYS_INDEXES.NAME IN (PRIMARY, GENERAL_CLUSTERED_INDEX);‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐| TABLE_NAME | TABLE_ID | INDEX_NAME | INDEX_ID |‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐| moodle2/mdl2_user | 646 | PRIMARY | 1867 |‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐1 row in set (0.00 sec)INDEX_ID返回与名称1相应的提取的页文件$ ls pages‐ibdata1/FIL_PAGE_INDEX/*1867.pagepages‐ibdata1/FIL_PAGE_INDEX/0000000000001867.pagec_parser此时有了已知的表定义数据能被c_parser恢复像这样其中mdl2_user.sql 包含表定义$ ./c_parser ‐b ./pages‐ibdata1/FIL_PAGE_TYPE_BLOB ‐p dumps/moodle2 ‐ldumps/moodle/mdl2_user.load ‐5f pagesibdata1/FIL_PAGE_INDEX/0000000000001867.page ‐t mdl2_user.sql对每个schema使用以下脚本和在转储目录中的给定表定义所有在数据目录找到的表能被提取到适合LOAD DATA INFILE的文件以及分开的.load文件来加载它们。如果原始表定义不能被提供或从.frm文件被提取反注释sys_parser行只作为最后方法。如果原始表defs能被提供它们应该被作为分开的sql文件储存在dumps//#!/bin/bashRECOVERY_DBtestUSERrootPASSsomepassDUMPSdumps# Create schemaecho ${DUMPS}/schema.sqlfor DB in mysql ‐‐user${USER} ‐‐password${PASS} ‐NBe select name from${RECOVERY_DB}.sys_tables | sed ‐r s/^(.*)\/.*$// | grep ‐v SYS_ | sort ‐u domkdir ‐p ${DUMPS}/${DB}echo Creating schema for $DB...echo ${DUMPS}/schema.sqlecho CREATE DATABASE IF NOT EXISTS $DB; ${DUMPS}/schema.sqlfor TABLE in mysql ${RECOVERY_DB} ‐‐user${USER} ‐‐password${PASS} ‐NBeSELECT NAME FROM SYS_TABLES WHERE NAME LIKE ${DB}/%doecho $TABLE# ./sys_parser ‐u${USER} ‐p${PASS} ‐d ${RECOVERY_DB} ${TABLE} | tee${DUMPS}/${TABLE}.sql ${DUMPS}/schema.sqlPKEYmysql ${RECOVERY_DB} ‐BNe SELECT SYS_INDEXES.ID FROM SYS_TABLESLEFT JOIN SYS_INDEXES ON (SYS_TABLES.ID SYS_INDEXES.TABLE_ID) WHERESYS_TABLES.NAME \${TABLE}\ AND SYS_INDEXES.NAME\PRIMARY\echo pkey $PKEYPAGEpages‐ibdata1/FIL_PAGE_INDEX/printf %016u ${PKEY}.pageecho PAGE $PAGE./c_parser ‐b ./pages‐ibdata1/FIL_PAGE_TYPE_BLOB ‐p ./${DUMPS}/${DB} ‐l ${DUMPS}/${TABLE}.load ‐5f ${PAGE} ‐t ${DUMPS}/${TABLE}.sql ${DUMPS}/${TABLE}donedonesys_parser像之前所说的sys_parser能被用于从ibdata文件提取表定义但它仅应当作为最后手段。可能需要一些猜测而且如果不能提供有效的表定义从ibdata完整提取可用数据就不太可能了。从.frm文件提取有效表定义使用MySQL Utilities包的mysqlfrm从未损坏的.frm文件提取有效定义是可能的。要注意的是在诊断模式下使用mysqlfrm可能遇到与使用sys_parser从ibdata提取数据相同的问题。所以使用mysqlfrm与服务器标识是很重要的。输出必须被调整来与c_parser运作因为如果命令行警告或默认字符集信息在表定义中被找到c_parser会终止。这里是提取表定义和单个schema.sql被用于从在给定目录中找到的所有.frm文件创建schema(s)的方式#!/bin/bashfor FRM in find ../datadir/ ‐type f ‐wholename *frm | sortdomysqlfrm ‐‐serverroot:somepasslocalhost:../datadir/mysql.sock ‐‐port33307$FRM | extract_schema.plif [ ${PIPESTATUS[0]} ‐ne 0 ]; thenecho $FRM is corruptfidoneextract_schema.pl像这样!/usr/bin/perlopen (SCHEMAFILE, , schema.sql) or die Can not write to schema.sql $!;$schema ;$table ;while () {$origline $ _;chomp;if (/^ CREATE TABLE.*$/) {m/.*CREATE TABLE \(. *)\\.\(.*)\[[:space:]]\(/;$schema $1;$table $2;print Creat ing $schema.$table\n;unless (‐e $schema or mkdir $schem a) {die Unable to create dir for sche ma $schema;}print SCHEMAFILE CREATE DATABASE IF NOT EXISTS $schema;\n;print SCHEMAFILE USE $schema;\n;print SCHEMAFILE $origline;open (TABLEFILE, , $schem a/$table.sql) or die Can not write to $schema/$table.sql;print TABLEF ILE CREATE TABLE $table (\n;}else {s/ENGINE(.*?)[[:space:]].*/ENGINE;/;s/PRIMARY//;s/^#.*$//;s/^WARNING.*$//;$origline ~ s/(.*ENGINE.*$)/;/;$origline ~ s/^#.*$//;$origline ~ s/^WARNING.*$//;print SCHEMAFILE $origline if (!/^\s*$/);print TABLEFILE $_\n if (!/^\s*$/);}}尽管undrop 可用令人高兴 但遇到必须使用它的情况是非常糟糕的。当数据库损坏时它不能保证任何数据能被恢复。避免陷入这种情况的方法就是使用MySQL Enterprise Backup来定期创建可用的备份以及至少一个复制slave。关心数据安全的聪明管理员会在远程创建一个复制slave将服务器的定期备份作为灾难恢复的准备。