從mysql的data目錄中恢復數據庫


某台mysql數據庫,突然掉電,重啟系統啟動數據庫失敗,進入數據庫目錄發現數據文件完好,從新初始化數據庫,從數據文件中恢復數據

一、將/home/mysql-5.7.26/data/目錄復制出來

[root@orderer home]# cd mysql-5.7.26/
[root@orderer mysql-5.7.26]# cp -R data/ ../data_bak

二、刪除/home/mysql-5.7.26/data/目錄,因為初始化數據庫的時候,data目錄必須為空

[root@orderer mysql-5.7.26]# rm -rf data/
[root@orderer mysql-5.7.26]# mkdir data

由於我是root賬戶操作的,所以將data目錄權限賦予mysql用戶

[root@orderer mysql-5.7.26]# chown -R mysql:mysql data

三、重新初始化數據庫

[root@orderer home]# mysqld_safe --defaults-file=/etc/mysql/my.cnf --initialize --basedir=/home/mysql-5.7.26/ --datadir=/home/mysql-5.7.26/data/
2020-01-19T07:11:22.220590Z mysqld_safe Logging to '/home/mysql-5.7.26/log/mysqld.log'.
2020-01-19T07:11:22.266396Z mysqld_safe Starting mysqld daemon with databases from /home/mysql-5.7.26/data
2020-01-19T07:11:33.111853Z mysqld_safe mysqld from pid file /home/mysql-5.7.26/run/mysqld.pid ended

此時,查看data目錄下已經生成了相關文件

[root@orderer mysql-5.7.26]# ll data
??? 110668
-rw-r----- 1 mysql mysql       56 1?  19 15:11 auto.cnf
-rw------- 1 mysql mysql     1680 1?  19 15:11 ca-key.pem
-rw-r--r-- 1 mysql mysql     1112 1?  19 15:11 ca.pem
-rw-r--r-- 1 mysql mysql     1112 1?  19 15:11 client-cert.pem
-rw------- 1 mysql mysql     1680 1?  19 15:11 client-key.pem
-rw-r----- 1 mysql mysql      419 1?  19 15:11 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 1?  19 15:11 ibdata1
-rw-r----- 1 mysql mysql 50331648 1?  19 15:11 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 1?  19 15:11 ib_logfile1
-rw-r----- 1 mysql mysql      177 1?  19 15:11 master-18-69.000001
-rw-r----- 1 mysql mysql       22 1?  19 15:11 master-18-69.index
drwxr-x--- 2 mysql mysql     4096 1?  19 15:11 mysql
drwxr-x--- 2 mysql mysql     8192 1?  19 15:11 performance_schema
-rw------- 1 mysql mysql     1680 1?  19 15:11 private_key.pem
-rw-r--r-- 1 mysql mysql      452 1?  19 15:11 public_key.pem
-rw-r--r-- 1 mysql mysql     1112 1?  19 15:11 server-cert.pem
-rw------- 1 mysql mysql     1676 1?  19 15:11 server-key.pem
drwxr-x--- 2 mysql mysql     8192 1?  19 15:11 sys

查找mysql.log日志過濾"temporary password",得到系統生成的初始隨機密碼,第一次登陸使用

[root@orderer mysql-5.7.26]# cat /home/mysql-5.7.26/log/mysqld.log|grep 'temporary password'
2020-01-19T07:11:25.453456Z 1 [Note] A temporary password is generated for root@localhost: PcrY;58llX3<

四、啟動mysql

[root@orderer home]# mysqld_safe --defaults-file=/etc/mysql/my.cnf 
2020-01-19T07:16:34.019182Z mysqld_safe Logging to '/home/mysql-5.7.26/log/mysqld.log'.
2020-01-19T07:16:34.065328Z mysqld_safe Starting mysqld daemon with databases from /home/mysql-5.7.26/data

連接mysql,使用初始隨機密碼登陸

[root@orderer mysql-5.7.26]# mysql -uroot -p -S /home/mysql-5.7.26/mysql.sock
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.7.26-log

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

五、修改root密碼

mysql> alter user 'root'@'localhost' identified by 'xxxxxxx';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> 

使用新密碼重新登錄

[root@orderer mysql-5.7.26]# mysql -uroot -p -S /home/mysql-5.7.26/mysql.sock
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 5.7.26-log Source distribution

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

mysql> 

允許root遠程登陸

[root@push-5-222 /]# mysql -uroot -p -S /home/mysql-5.7.26/mysql.sock
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.26 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> update user set host='%' where user='root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> 

 

此時,看到數據庫只有mysql,接下來,我們停掉mysql服務

[root@orderer mysql-5.7.26]# mysqladmin -uroot -p -S /home/mysql-5.7.26/mysql.sock shutdown
Enter password: 
[root@orderer mysql-5.7.26]# 

六、將備份的數據文件中的數據庫目錄文件夾test復制到data目錄下

[root@orderer mysql-5.7.26]# cp -r ../data_bak/test/ data/

查看data目錄

[root@orderer mysql-5.7.26]# ll data/
??? 110672
-rw-r----- 1 mysql mysql       56 1?  19 15:11 auto.cnf
-rw------- 1 mysql mysql     1680 1?  19 15:11 ca-key.pem
-rw-r--r-- 1 mysql mysql     1112 1?  19 15:11 ca.pem
-rw-r--r-- 1 mysql mysql     1112 1?  19 15:11 client-cert.pem
-rw------- 1 mysql mysql     1680 1?  19 15:11 client-key.pem
-rw-r----- 1 mysql mysql      356 1?  19 15:23 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 1?  19 15:23 ibdata1
-rw-r----- 1 mysql mysql 50331648 1?  19 15:23 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 1?  19 15:11 ib_logfile1
-rw-r----- 1 mysql mysql      177 1?  19 15:11 master-18-69.000001
-rw-r----- 1 mysql mysql      573 1?  19 15:23 master-18-69.000002
-rw-r----- 1 mysql mysql       44 1?  19 15:16 master-18-69.index
drwxr-x--- 2 mysql mysql     4096 1?  19 15:11 mysql
drwxr-x--- 2 mysql mysql     8192 1?  19 15:11 performance_schema
-rw------- 1 mysql mysql     1680 1?  19 15:11 private_key.pem
-rw-r--r-- 1 mysql mysql      452 1?  19 15:11 public_key.pem
-rw-r--r-- 1 mysql mysql     1112 1?  19 15:11 server-cert.pem
-rw------- 1 mysql mysql     1676 1?  19 15:11 server-key.pem
drwxr-x--- 2 mysql mysql     8192 1?  19 15:11 sys
drwxr-x--- 2 root  root       202 1?  19 15:24 test

test目錄已經復制過來,因為是用root賬戶復制的,所以這里將文件所有者變更為mysql

[root@orderer mysql-5.7.26]# chown -R mysql:mysql data/test/
[root@orderer mysql-5.7.26]# ll data
??? 110672
-rw-r----- 1 mysql mysql       56 1?  19 15:11 auto.cnf
-rw------- 1 mysql mysql     1680 1?  19 15:11 ca-key.pem
-rw-r--r-- 1 mysql mysql     1112 1?  19 15:11 ca.pem
-rw-r--r-- 1 mysql mysql     1112 1?  19 15:11 client-cert.pem
-rw------- 1 mysql mysql     1680 1?  19 15:11 client-key.pem
-rw-r----- 1 mysql mysql      356 1?  19 15:23 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 1?  19 15:23 ibdata1
-rw-r----- 1 mysql mysql 50331648 1?  19 15:23 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 1?  19 15:11 ib_logfile1
-rw-r----- 1 mysql mysql      177 1?  19 15:11 master-18-69.000001
-rw-r----- 1 mysql mysql      573 1?  19 15:23 master-18-69.000002
-rw-r----- 1 mysql mysql       44 1?  19 15:16 master-18-69.index
drwxr-x--- 2 mysql mysql     4096 1?  19 15:11 mysql
drwxr-x--- 2 mysql mysql     8192 1?  19 15:11 performance_schema
-rw------- 1 mysql mysql     1680 1?  19 15:11 private_key.pem
-rw-r--r-- 1 mysql mysql      452 1?  19 15:11 public_key.pem
-rw-r--r-- 1 mysql mysql     1112 1?  19 15:11 server-cert.pem
-rw------- 1 mysql mysql     1676 1?  19 15:11 server-key.pem
drwxr-x--- 2 mysql mysql     8192 1?  19 15:11 sys
drwxr-x--- 2 mysql mysql      202 1?  19 15:24 test

再次啟動mysql服務,並連接mysql,查看數據庫

[root@orderer mysql-5.7.26]# mysql -uroot -p -S /home/mysql-5.7.26/mysql.sock
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.26-log Source distribution

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> 

發現已經出現了test數據庫,我們切換到test,並查看表

mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| t_product_item |
| test           |
+----------------+
2 rows in set (0.00 sec)

可以看到數據庫中的表,我們查詢一個表

mysql> select * from test;
ERROR 1146 (42S02): Table 'test.test' doesn't exist
mysql> 

此時,報錯,表不存在,這是因為我們沒有將備份的data目錄下的ibdata1文件復制過來的原因,數據庫引擎使用innodb時,ibdata1文件保存了數據庫元數據信息,里面保存了每個數據庫里的每個表的ID

所以,我們接下來將備份的data目錄下的ibdata1復制到新的數據庫data目錄下覆蓋

七、將備份data目錄下的ibdata1文件復制到新數據庫data目錄下並覆蓋

停掉mysql

[root@orderer mysql-5.7.26]# mysqladmin -uroot -p -S /home/mysql-5.7.26/mysql.sock shutdown
Enter password: 
[root@orderer mysql-5.7.26]# 

復制備份data目錄下的ibdata1文件到數據庫data目錄下,提示是否覆蓋,輸入y

[root@orderer mysql-5.7.26]# cp ../data_bak/ibdata1 data/
cp:????"data/ibdata1"? y
[root@orderer mysql-5.7.26]# 

我們再次啟動mysql,並連接mysql

[root@orderer home]# mysqld_safe --defaults-file=/etc/mysql/my.cnf 
2020-01-19T07:36:22.526939Z mysqld_safe Logging to '/home/mysql-5.7.26/log/mysqld.log'.
2020-01-19T07:36:22.574112Z mysqld_safe Starting mysqld daemon with databases from /home/mysql-5.7.26/data
[root@orderer mysql-5.7.26]# mysql -uroot -p -S /home/mysql-5.7.26/mysql.sock
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.26-log Source distribution

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

打開test數據庫,並查看表

mysql> use test;
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| t_product_item |
| test           |
+----------------+
2 rows in set (0.00 sec)

mysql> 

再查詢test表

mysql> select * from test;
+------+--------+
| id   | name   |
+------+--------+
|    1 | aaaaa  |
|    2 | bbbb   |
|    3 | ccccc  |
|    4 | dddddd |
|    5 | eeeeee |
|    6 | fffff  |
|    7 | rrrrr  |
|    8 | uuuuuu |
|   10 | eerrrr |
+------+--------+
9 rows in set (0.00 sec)

mysql> 

數據庫可以正常讀取了,我們再插入一條數據

mysql> insert into test values(11,'hhhhhh');
Query OK, 1 row affected (0.03 sec)

成功,查詢

mysql> select * from test;
+------+--------+
| id   | name   |
+------+--------+
|    1 | aaaaa  |
|    2 | bbbb   |
|    3 | ccccc  |
|    4 | dddddd |
|    5 | eeeeee |
|    6 | fffff  |
|    7 | rrrrr  |
|    8 | uuuuuu |
|   10 | eerrrr |
|   11 | hhhhhh |
+------+--------+
10 rows in set (0.00 sec)

mysql> 

可以正常讀寫,至此數據文件恢復數據完成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM