mysql系统数据库 恢复_操作系统层面恢复mysql的数据库

利用复制一个mysql中的库的目录,来恢复mysql数据库。

问题描述:

2018年1月10号上午10点我们的oa系统的服务器突然down机,尝试启动服务器,但磁盘出现问题,最后只能用显示器直接连接服务器,crt不能远程连接,它也不能ssh到别的服务器,也不能scp文件到别的服务器,只能通过移动硬盘,把程序和数据库的备份copy出来,每天晚上mysqldump的sql文件,如果使用它恢复数据的话,今天早上的打卡记录就没有了,于是尝试使用操作系统目录恢复数据

我们知道mysql中每个数据库对应一个目录,然后这个库下的所有表都在这个目录下,如果这个mysql开启了独立表空间,理论上是可以用这个目录恢复数据的,

下面说下具体的流程:下面过程能成功的前提是源端mysql开启了独立表空间 也就是参数innodb_file_per_table =on

一:首先在目的端创建上需要恢复的那个库

mysql> create database oa;

Query OK, 1 row affected (0.03 sec)

二:根据昨天的备份的sql文件,恢复出oa库下的表结构,必须做这一步,否则mysql数据字典中没有这些表的信息,那么这些表就不能使用,也就是不能进行dml操作;

mysql> use oa;

mysql> source oa-20180109.sql;

mysql> show tables; #查看确实已经有了表结构,我们只需要创建表结构就可以。

+------------------------------------------+

| Tables_in_oa |

+------------------------------------------+

| 20161213_2_sch_assess_mark_opponent_copy |

| 20161213sch_assess_copy |

| 20161213sch_assess_mark_column_copy |

| 20161213sch_assess_mark_copy |

| 20161213sch_assess_mark_opponent_copy |

| 20161213sch_assess_order_copy |

| 20161213sch_assess_player_copy |

| #Tableau_sid_000011DF_2_Group |

| #Tableau_sid_000011E1_4_Group |

| #Tableau_sid_000011EE_4_Group |

| #Tableau_sid_000011EE_5_Group |

| BDF2_BLOB_STORE |

| BDF2_CLOB_STORE |

| BDF2_COMPANY |

| BDF2_COMPONENT |

三:在操作系统层面用copy出来的oa目录,覆盖现在的oa目录;

bogon:root@/>ps -ef | grep mysql

root 20076 7826 0 21:44 pts/2 00:00:00 grep --color=auto mysql

root 25748 1 0 2017 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/mysql/data/data--pid-file=/var/run/mysql/mysql.pid

bogon:root@/> cd/mysql/data/data

bogon:root@/mysql/data/data>ll

total 1126436

-rw-rw----. 1 mysql mysql 56 Dec 15 11:46 auto.cnf

-rw-rw----. 1 mysql mysql 79691776 Jan 10 21:32 ibdata1

-rw-rw----. 1 mysql mysql 536870912 Jan 10 21:32 ib_logfile0

-rw-rw----. 1 mysql mysql 536870912 Jan 10 21:32 ib_logfile1

drwx------. 2 mysql mysql 4096 Jan 4 16:38 liuwenhe

drwx------. 2 mysql mysql 4096 Dec 20 22:10 mysql

drwx------. 2 mysql mysql 12288 Jan 10 21:31 oa

drwx------. 2 mysql mysql 4096 Dec 20 22:10 performance_schema

drwx------. 2 mysql mysql 6 Dec 20 22:10 test

bogon:root@/>cp -r oa_bak/ /mysql/data/data

bogon:root@/mysql/data/data>ll

total 1126452

-rw-rw----. 1 mysql mysql 56 Dec 15 11:46 auto.cnf

-rw-rw----. 1 mysql mysql 79691776 Jan 10 21:32 ibdata1

-rw-rw----. 1 mysql mysql 536870912 Jan 10 21:32 ib_logfile0

-rw-rw----. 1 mysql mysql 536870912 Jan 10 21:32 ib_logfile1

drwx------. 2 mysql mysql 4096 Jan 4 16:38 liuwenhe

drwx------. 2 mysql mysql 4096 Dec 20 22:10 mysql

drwx------. 2 mysql mysql 12288 Jan 10 21:31 oa

drwx------. 2 root root 12288 Jan 10 21:46 oa_bak

drwx------. 2 mysql mysql 4096 Dec 20 22:10 performance_schema

drwx------. 2 mysql mysql 6 Dec 20 22:10 test

bogon:root@/mysql/data/data>rm -rf oa

bogon:root@/mysql/data/data>mv oa_bak oa

四:一定注意修改oa目录的权限,

bogon:root@/mysql/data/data>chown -R mysql:mysql oa

五:查看数据库是否正常

查看确实已经有了今天的数据

mysql> use oa;

mysql> select * from LOG_ATTENDANCE where User_Uid='liuwenhe' order by 4 desc limit 2;

+---------+----------+---------------+---------------------+

| Sort_ID | User_Uid | IP_Address | Create_Date |

+---------+----------+---------------+---------------------+

| 213614 | liuwenhe | 192.168.8.172 | 2018-01-10 08:12:50 |

| 213501 | liuwenhe | 192.168.8.172 | 2018-01-09 17:47:59 |

+---------+----------+---------------+---------------------+

尝试做增删改查操作,是可以的;

mysql> create table test (id int);

Query OK, 0 rows affected (0.24 sec)

mysql> insert into test values (1);

Query OK, 1 row affected (0.04 sec)

六:最后一步很关键,

因为我是在一套主主复制的mysql上恢复的,这个操作我只是在一个实例上操作了,所以我打算先mysqldump出来这个库,然后再删除这个库,之后再从新恢复出来,保证两套库数据一致;

bogon:root@/mysql/data/data>mysqldump -uroot -pliuwenhe oa >oa.sql

但是删除这个库有问题,(后来我模拟这个过程的时候,没有报错,很奇怪!)

mysql> drop database oa;

ERROR 1010 (HY000): Error dropping database (can't rmdir './oa/', errno: 17)

于是从操作系统级别直接删除目录,两个实例都删除

bogon:root@/mysql/data/data>rm -rf oa

然后从新创建上库oa,并恢复出最近的数据;

mysql> create database oa;

mysql> source oa.sql;

至此利用操作系统的文件恢复数据库的操作完成了;

总结:mysql数据库不像oracle那样有scn号,oracle SCN是用于标示数据库变化的唯一标识号,其数值顺序递增。当执行事务时(DML语句、DDL语句),系统会为每个事务变化生成相应的SCN,也就并且oracle数据库中一共有四个scn号,分别为系统scn、文件scn、结束scn,这三者是在控制文件中,数据文件头部scn在数据文件上,当数据库启动的时候,会校验这些scn号(具体怎么校验参考http://blog.itpub.net/29654823/viewspace-2127804/),如果不一致,并且没有redo或者归档日志的话,数据库就会有问题,所以oracle很难直接用文件来恢复其中的一个表,mysql居然可以,并且还可以直接删除数据库目录,然后数据库实例不会出现任何问题,只是这个目录对应的库就没有了,并且数据字典中也就没有这个库了;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值