首要步骤是关闭MYSQL实例和备份数据目录 /etc/init.d/mysqld stop mkdir /root/myql_backup tar -jcvf /root/myql_backup/mysql_data.tar.bz2 /var/lib/mysql 尝试启动 mysql 实例 /etc/init.d/mysqld start 如果实例不崩溃那么 用mysqldump做逻辑备份 /etc/init.d/mysql start mysqldump --single-transaction -AER > /root/dump_wtrans.sql mysqldump -AER > /root/dump.sql 如果 MYSQL 实例崩溃则 尝试设置 innodb_force_recovery 参数 例如 mode=1; sed -i "/^\[mysqld\]/{N;s/$/\ninnodb_force_recovery=$mode/}" /etc/my.cnf 注意这些的mode=1 设置了 innodb_force_recovery 参数的级别 innodb_force_recovery 的参数级别含义为: Mode 1 当发现一个损坏的数据页时不让MYSQL实例自动崩溃 Mode 2 不启用后台操作 Mode 3 不尝试 回滚事务 Mode 4 不计算状态也不应用buffer change Mode 5 在启动过程中不去关心undo log Mode 6 在启动过程中不关心重做日志ib_logfiles, 不去做前滚 以上 mode 2 会包含 mode 1, mode 3会包含 mode 2和 mode 1 ,依此类推 同时从 MYSQL 5.6.15 开始 mode 4-6 会让mysql 以只读模式运行 若已经设置了innodb_force_recovery =6 还是有问题 ,那么需要进一步诊断 检查日志 tail -200 /var/lib/mysql/`hostname`.err tail -f /var/log/mysqld.log 如发现 InnoDB: Database page corruption on disk or a failed InnoDB: file read of page 515891. 以上报错说明mysql innodb 引擎发现有数据页损坏 进一步诊断: #!/bin/bash for i in $(ls /var/lib/mysql/*/*.ibd) do innochecksum $i done or DATADIR=/var/lib/mysql; find $DATADIR -type f -name *.ibd -o -name ibdata* | xargs -I{} innochecksum {} 如发现 mysql: 120901 9:43:55 InnoDB: Error: page 70944 log sequence number 8 1483471899 mysql: InnoDB: is in the future! Current system log sequence number 5 612394935. mysql: InnoDB: Your database may be corrupt or you may have copied the InnoDB mysql: InnoDB: tablespace but not the InnoDB log files. See mysql: InnoDB: [url=http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html]MySQL :: MySQL 5.5 Reference Manual :: 14.21.2 Starting InnoDB on a Corrupted Database[/url] 以上日志为LSN 不同步问题, 其一般可以通过 设置 innodb_force_recovery解决的 如发现 [ERROR] Table ./database/table has no primary key in InnoDB data dictionary, but has one in MySQL! InnoDB: Error: table 'database/table' InnoDB: in InnoDB data dictionary has tablespace id 423, InnoDB: but tablespace with that id or name does not exist. Have InnoDB: you deleted or moved .ibd files? [ERROR] Cannot find or open table database/table from the internal data dictionary of InnoDB though the .frm file for the table exists. Maybe you have deleted and recreated InnoDB data files but have forgotten to delete the corresponding .frm files of InnoDB tables, or you have moved .frm files to another database? or, the table contains indexes that this version of the engine doesn't support. 可能丢失了表的.frm 或 .ibd文件 ,找回这些文件 当实例可以启动 那么如何检测表是否存在讹误? 可以使用 check table 命令 mysql> CHECK TABLE roundcube.users; +-----------------+-------+----------+----------+ | Table | Op | Msg_type | Msg_text | +-----------------+-------+----------+----------+ | roundcube.users | check | status | OK | +-----------------+-------+----------+----------+ 1 row in set (0.13 sec) mysql> CHECK TABLE roundcube.dictionary; +----------------------+-------+----------+----------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +----------------------+-------+----------+----------------------------------------------------------------+ | roundcube.dictionary | check | Warning | InnoDB: Tablespace is missing for table 'roundcube/dictionary' | | roundcube.dictionary | check | Error | Table 'roundcube.dictionary' doesn't exist | | roundcube.dictionary | check | status | Operation failed | +----------------------+-------+----------+----------------------------------------------------------------+ 3 rows in set (0.00 sec) 如果以上检测发现讹误,则可能导致mysql崩溃 ,那么可能需要使用 innodb_force_recovery=1 来启动实例 否则可能启动时实例崩溃 可以使用 mysqlcheck 来检测一个数据库 [root@ocp ~]# mysqlcheck -A -uroot -p Enter password: mysql.columns_priv OK mysql.component OK mysql.db OK mysql.default_roles OK mysql.engine_cost OK mysql.func OK mysql.general_log OK mysql.global_grants OK mysql.gtid_executed OK mysql.help_category OK mysql.help_keyword OK mysql.help_relation OK mysql.help_topic OK mysql.innodb_index_stats OK mysql.innodb_table_stats OK mysql.password_history OK mysql.plugin OK mysql.procs_priv OK mysql.proxies_priv OK mysql.role_edges OK mysql.server_cost OK mysql.servers OK mysql.slave_master_info OK mysql.slave_relay_log_info OK mysql.slave_worker_info OK mysql.slow_log OK mysql.tables_priv OK mysql.time_zone OK mysql.time_zone_leap_second OK mysql.time_zone_name OK mysql.time_zone_transition OK mysql.time_zone_transition_type OK mysql.user OK recovery.testeasy OK sys.sys_config OK 如何从frm文件中恢复create table建表语句 可以从 https://downloads.mysql.com/archives/utilities/ 下载 MySQL Utilities tar xvzf mysql-utilities* cd mysql-utilities-1.4.3 chmod +x setup.py ./setup.py build ./setup.py install mysqlfrm 会自己建一个mysql实例 需要单独的端口 mysqlfrm --basedir=/usr --user=mysql --port=3308 /var/lib/mysql/testdb/staff.frm # Spawning server with --user=mysql. # Starting the spawned server on port 3308 ... done. # Reading .frm files # # Reading the staff.frm file. # # CREATE statement for staff.frm: # CREATE TABLE `staff` ( `staff_id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT, `first_name` varchar(45) NOT NULL, `last_name` varchar(45) NOT NULL, `address_id` smallint(5) unsigned NOT NULL, `picture` blob, `email` varchar(50) DEFAULT NULL, `store_id` tinyint(3) unsigned NOT NULL, `active` tinyint(1) NOT NULL DEFAULT '1', `username` varchar(16) NOT NULL, `password` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`staff_id`), KEY `idx_fk_store_id` (`store_id`), KEY `idx_fk_address_id` (`address_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 #...done. 有时需要 SET FOREIGN_KEY_CHECKS=0; 才能建表成功 在实例 没崩溃情况下 如何重建有问题的表 mysql -u root -p USE dbname; CREATE TABLE tablename_recovered LIKE tablename; INSERT INTO tablename_recovered SELECT * FROM tablename; 这里 先见表 后插入 插入如果 遇到问题页面 ,那么可以用limit insert ignore into tablename_recovered select * from tablename limit 10; insert ignore into tablename_recovered select * from tablename limit 50; insert ignore into tablename_recovered select * from tablename limit 100; insert ignore into tablename_recovered select * from tablename limit 200; ... 测试 下插入到哪个位置 才报错 如果成功复制表 那么把原表删除 新表重命名 DROP dbname.tablename; RENAME TABLE dbname.tablename_recovered TO dbname.tablename; 还原 所有数据库和 重置 ibdata/ib_log files 首先要有 有效的备份, 做这些操作前 确认这个备份可用!! mysqldump -AER > /root/recovery_dump.sql 干掉所有 有问题的db mysql> SET FOREIGN_KEY_CHECKS=0; mysql> DROP DATABASE db1; mysql> DROP DATABASE db2; ... 重启mysql 实例 mysql -e "SET GLOBAL innodb_fast_shutdown = 0" /etc/init.d/mysql stop sed -i '/innodb_force_recovery/d' /etc/my.cnf nohup /etc/init.d/mysql start & tail -f /var/lib/mysql/`hostname`.err 恢复 数据 mysql < /root/recovery_dump.sql 对于 Log Sequence Number Mismatched/In Future 可以考虑重建整个数据库 也可以重建重做日志 mysql -e "SET GLOBAL innodb_fast_shutdown = 0" /etc/init.d/mysql stop cd /var/lib/mysql mv ib_logfile0 ib_logfile0.bak mv ib_logfile1 ib_logfile1.bak /etc/init.d/mysql start 或者 临时交换存储引起 为myisam 然后换回来 mysql -e "SELECT concat('ALTER TABLE ', TABLE_NAME,' ENGINE=MYISAM;') FROM Information_schema.TABLES WHERE TABLE_SCHEMA = 'db_name' AND ENGINE = 'InnoDB' AND TABLE_TYPE = 'BASE TABLE'" /etc/init.d/mysql stop mkdir -p /root/innodb.bak mv ib* /root/innodb.bak/ /etc/init.d/mysql start mysql -e "SELECT concat('ALTER TABLE ', TABLE_NAME,' ENGINE=InnoDB;') FROM Information_schema.TABLES WHERE TABLE_SCHEMA = 'db_name' AND ENGINE = 'MyISAM'" 如何合适的删除.ibd文件 可以使用如下命令 SET FOREIGN_KEY_CHECKS=0; mysql -e "ALTER TABLE roundcube.staff DISCARD TABLESPACE" 如果误删除了 .ibd文件 如何 基于备份恢复前的清理工作 [ERROR] MySQL is trying to open a table handle but the .ibd file for table dbname/tblname does not exist. ALTER TABLE dbname.tblname DISCARD TABLESPACE; InnoDB: Warning: cannot delete tablespace 251 in DISCARD TABLESPACE. InnoDB: But let us remove the insert buffer entries for this tablespace. DROP TABLE dbname.tblname; InnoDB: We removed now the InnoDB internal data dictionary entry InnoDB: of table `dbname/tblname`. 如上完成后 再恢复重建整个表 .frm 文件在 但数据字典里没这个表了 先备份.frm 文件 然后执行 create table重建表 丢失.frm文件 但字典里有这个表 InnoDB: Error: table dbname/tblname already exists in InnoDB internal InnoDB: data dictionary. Have you deleted the .frm file InnoDB: and not used DROP TABLE? ... InnoDB: You can drop the orphaned table inside InnoDB by InnoDB: creating an InnoDB table with the same name in another InnoDB: database and moving the .frm file to the current database. InnoDB: Then MySQL thinks the table exists, and DROP TABLE will InnoDB: succeed. 可以在别的db下重建这个表获得.frm 文件 然后拷贝过去 # mysql mysql> CREATE DATABASE test2; mysql> CREATE TABLE ... CHARSET=utf8; mysql> quit # cp /var/lib/mysql/test2/test.frm /var/lib/mysql/test/ # mysql mysql> SET FOREIGN_KEY_CHECKS=0; mysql> DROP TABLE test.test;
-
3D Cloud
12.1.0.2 asm asm恢复 bbed dmp损坏 dul i_obj4 ORA-00202 ORA-00312 ORA-00313 ORA-00333 ORA-00340 ORA-00353 ORA-00354 ORA-00600 ORA-00604 ORA-00607 ORA-00704 ORA-01110 ORA-01115 ORA-01157 ORA-01190 ORA-01194 ORA-01207 ORA-01555 ORA-01578 ORA-01595 ORA-08102 ORA-08103 ORA-600 2662 ORA-600 2663 ORA-600 4000 ORA-600 4137 ORA-600[2662] ORA-600[3020] ORA-600[4194] ORA-600[17182] ORA-15042 ORA-19502 ORA-27072 oracle dul Oracle recover oracle异常恢复 Oracle 恢复 ORACLE恢复
WP Cumulus Flash tag cloud by 惜分飞 requires Flash Player 9 or better.
QQ咨询
-
最近发表
- rm -rf误删Oracle数据库恢复
- 分布式存储故障导致数据库无法启动故障处理
- read_me_recover_tn勒索恢复
- WINDOWS 下用dg broker搭建ADG(单机to单机)
- 存储故障后oracle报—ORA-01122/ORA-01207故障处理
- Oracle 23ai rm redo*.log恢复
- Oracle 发布计划—包含Oracle 23ai版本
- Oracle 23ai 变化之—-默认数据文件变为bigfile
- PostgreSQL解析wal日志之—walminer
- Oracle 19c/21c最新patch信息-202404
- PostgreSQL恢复系列:pg_filedump批量处理
- PostgreSQL部分主要字典信息
- PostgreSQL恢复系列:pg_filedump恢复字典构造
- PostgreSQL 16 源码安装
- ORA-00742 ORA-00312 恢复
- 数据库open成功后报ORA-00353 ORA-00354错误引起的一系列问题(本质ntfs文件系统异常)
- ORA-600 ktsiseginfo1故障
- ORA-00600: internal error code, arguments: [16703], [1403], [4] 原因
- 最近遇到几起ORA-600 16703故障(tab$被清空),请引起重视
- ORA-600 2662快速恢复之Patch scn工具
- TNS-12518: TNS:listener could not hand off client connection
- ora.storage无法启动报ORA-12514故障处理
- 断电引起文件scn异常数据库恢复
- ORA-16188: LOG_ARCHIVE_CONFIG settings inconsistent with previously started instance
- .[hudsonL@cock.li].mkp勒索加密数据库完美恢复
- 模拟带库实现rman远程备份
- 又一例:ORA-600 kclchkblk_4和2662故障
- Oracle误删除数据文件恢复
- Oracle 19C 备库DML重定向—DML Redirection
- ORA-01595/ORA-600 4194处理
- 从ORA-00283 ORA-16433报错开始恢复
- 近期又遇到ORA-600 16703和ORA-702故障
- RECOVER_YOUR_DATA勒索恢复
- ORA-01033: ORACLE initialization or shutdown in progress 故障处理
- Oracle 19c/21c最新patch信息-202401
- 存储故障,强制拉库报ORA-600 kcbzib_kcrsds_1处理
- ORA-600 kcrf_resilver_log_1故障处理
- ORA-00600: internal error code, arguments: [4193], [35191], [35263]
- mysql数据库被黑恢复—应用层面delete删除
- ORA-00600: internal error code, arguments: [4194], [], [], [], [], [], [], []
- 记录一次ORA-01200完美恢复
- 如何拯救一个10多年的老库
- kfed修复ORA-15196
- 在线mv方式迁移数据文件导致数据库无法正常启动
- resetlogs失败故障恢复-ORA-01555
- ORA-01113 ORA-01110错误不一定都要Oracle Recovery Tools解决
- ssd trim导致fdisk格式化磁盘之后无法恢复
- kettle导致MySQL数据丢失恢复
- ORA-600 3020/ORA-600 2662故障
- MySQL数据库文件丢失恢复
Contributors