MySQL控制程式碼恢復的簡單嘗試
今天突然想起一個問題,那就是對於ibdata的恢復,如果我們簡單模擬一下,就會發現還是蠻有意思的。
首先我們得到兩個引數值,一個是刷髒頁的指標,另外一個是資料檔案的目錄。
mysql> show variables like '%pct%';
+------------------------------------------+-----------+
| Variable_name | Value |
+------------------------------------------+-----------+
| innodb_buffer_pool_dump_pct | 25 |
| innodb_compression_failure_threshold_pct | 5 |
| innodb_compression_pad_pct_max | 50 |
| innodb_max_dirty_pages_pct | 75.000000 |
| innodb_max_dirty_pages_pct_lwm | 0.000000 |
| innodb_old_blocks_pct | 37 |
+------------------------------------------+-----------+
6 rows in set (0.01 sec)
mysql> show variables like 'datadir';
+---------------+----------------+
| Variable_name | Value |
+---------------+----------------+
| datadir | /home/data/s1/ |
+---------------+----------------+
1 row in set (0.00 sec)
這個時候的檔案是下面的幾個:
[root@grtest s1]# ll ib*
-rw-r----- 1 mysql mysql 413 Jun 20 14:01 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 Jun 20 14:01 ibdata1
-rw-r----- 1 mysql mysql 50331648 Jun 20 14:01 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 Jun 20 14:01 ib_logfile1
-rw-r----- 1 mysql mysql 12582912 Jun 20 14:02 ibtmp1
其中,ib_buffer_pool是5.7的新特性,暫時沒有開啟,兩個redo日誌,一個臨時檔案。
我們可以測試一下破壞的情況,同時和事務結合起來。
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql> use test
Database changed
mysql> create table test(id int);
Query OK, 0 rows affected (0.01 sec)
手工開啟一個事務,但是不提交。
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test values(1000);
Query OK, 1 row affected (0.01 sec)
這個時候沒有commit,所以檢視binlog裡面目前是沒有匹配記錄的。
# mysqlbinlog -vv binlog.000001 |grep -i INSERT
而一旦提交之後,binlog裡面就會包含進去。
commit
[root@grtest s1]# mysqlbinlog -vv binlog.000001 |grep -i -a5 INSERT
BINLOG '
UZNjWRPhYAAAKwAAABIHAAAAANsAAAAAAAEABHRlc3QABHRlc3QAAQMAAQ==
UZNjWR7hYAAAJAAAADYHAAAAANsAAAAAAAEAAgAB//7oAwAA
'/*!*/;
### INSERT INTO `test`.`test`
### SET
### @1=1000 /* INT meta=0 nullable=1 is_null=0 */
# at 1846
#170710 22:47:11 server id 24801 end_log_pos 1873 Xid = 477
COMMIT/*!*/;
我們來驗證一下這種破壞場景下的資料情況,插入一條記錄,不提交,然後破壞檔案,檢視恢復的情況。
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test values(2000);
Query OK, 1 row affected (0.00 sec)
我們就把這些ib_字樣的檔案刪除了。
檢視mysqld的pid,發現測試環境中有大量的同類服務。
# pidof mysqld
30518 29944 29698 29401 15307 10659
換一個姿勢。
# netstat -nltp|grep mysqld|grep 24801
tcp 0 0 :::24801 :::* LISTEN 29401/mysqld
在系統目錄下,按照規律會發現下面的檔案。
# ll /proc/29401/fd|grep ib_*|grep delete
lrwx------ 1 root root 64 Jul 10 22:49 10 -> /home/data/s1/ib_logfile1 (deleted)
lrwx------ 1 root root 64 Jul 10 22:49 11 -> /home/data/s1/ibtmp1 (deleted)
lrwx------ 1 root root 64 Jul 10 22:49 12 -> /tmp/ibHcflkp (deleted)
lrwx------ 1 root root 64 Jul 10 22:49 4 -> /home/data/s1/ibdata1 (deleted)
lrwx------ 1 root root 64 Jul 10 22:49 5 -> /tmp/ibq7lvQK (deleted)
lrwx------ 1 root root 64 Jul 10 22:49 6 -> /tmp/ib59bGj5 (deleted)
lrwx------ 1 root root 64 Jul 10 22:49 7 -> /tmp/ibYubRMp (deleted)
lrwx------ 1 root root 64 Jul 10 22:49 8 -> /tmp/ib8LAUL4 (deleted)
lrwx------ 1 root root 64 Jul 10 22:49 9 -> /home/data/s1/ib_logfile0 (deleted)
我們做兩件事情,一件事給當前的環境上鎖,然後進行檔案的複製。
[root@grtest s1]# chown mysql:mysql xxxx
[root@grtest s1]# mv 10 /home/data/s1/ib_logfile1
[root@grtest s1]# mv 11 /home/data/s1/ibtmp1
[root@grtest s1]# mv 9 /home/data/s1/ib_logfile0
[root@grtest s1]# mv 4 /home/data/s1/ibdata1
正常停庫,啟庫。
這個時候驗證資料就會發現,之前的那個事務已經做了回滾。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2141877/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 嘗試讓查詢更簡單
- go1.18泛型的簡單嘗試Go泛型
- 一個人前後分離的簡單嘗試
- 安全管理:polardb密碼嘗試登入控制密碼
- iPhone簡訊刪除怎麼恢復?恢復iPhone簡訊的兩種簡單方法推薦iPhone
- Unity嘗試實現簡單的行為樹-01Unity
- 【開源之路】溫蒂、一次簡單的嘗試
- 【MySQL】Xtrabackup備份及恢復指令碼MySql指令碼
- mysql簡單效能測試MySql
- 嘗試做一個.NET簡單、高效、避免OOM的Excel工具OOMExcel
- linux 下mysql資料庫密碼恢復的方法LinuxMySql資料庫密碼
- 阿里雲 Mysql RDS 在 私有環境的恢復測試。阿里MySql
- MySQL資料庫的恢復MySql資料庫
- 介面自動化程式碼-AI 建立嘗試AI
- Mysql備份恢復MySql
- mysql資料恢復MySql資料恢復
- MySQL恢復過程MySql
- 【MySQL】MySQL備份和恢復MySql
- MySQL 非常規恢復與物理備份恢復MySql
- 與控制檔案有關的恢復
- 寶塔資料庫恢復 mysql資料庫丟失恢復 mysql資料庫刪除庫恢復 寶塔mysql資料庫恢復資料庫MySql
- 簡單的程式碼生成工具
- MySQL密碼加密認證的簡單指令碼MySql密碼加密指令碼
- eclipse怎麼簡單恢復預設背景顏色Eclipse
- mysql密碼忘記如何恢復(windows/liunx版本:mysql-8.0.27)MySql密碼Windows
- 算力驗證碼的嘗試
- Mysql update誤操作恢復MySql
- MySQL 備份與恢復MySql
- SQLSERVER恢復測試SQLServer
- 【RMAN】如果控制檔案損壞那麼如何恢復?恢復控制檔案的方式有哪幾種?
- 與控制檔案有關的恢復(二)
- 【程式碼鑑賞】簡單優雅的JavaScript程式碼片段(二):流控和重試JavaScript
- 安裝SQLServer2012 提示“等待資料庫引擎恢復控制程式碼失敗”SQLServer資料庫
- IDEA_Shelve程式碼擱置與恢復Idea
- Mysql的幾種備份與恢復MySql
- MySQL:Innodb恢復的學習筆記MySql筆記
- 阿里面試官:知道 MySQL 邏輯備份與恢復測試麼?阿里面試MySql
- RAC恢復到單機
- MySQL備份與恢復——基於Xtrabackup物理備份恢復MySql