国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

MySQL維護之--如何挽救誤操作

IT那活兒 / 2903人閱讀
MySQL維護之--如何挽救誤操作
點擊上方“IT那活兒”公眾號,關注后了解更多內容,不管IT什么活兒,干就完了!!!

  
在我們日常的數據庫維護工作中,可能會遇到這種情況:雖然專業維護人員極力去避免意外情況對數據庫系統穩定性、安全性的影響,但是很多情況下依然會超出我們的控制。

比如:業務人員誤操作操作部分表記錄的誤差;甚至可能是對表的誤刪除操作。

一旦發生了這些情況,作為數據庫維護人員,我們的職責是第一時間恢復數據,維持數據庫的可用性。下面就說明一下如何處理這些突發狀況。


表中部分記錄insert/update/delete回滾

如果對表執行DML操作后,發現有誤,需要回滾,最快速的方法就是使用工具binlog-rollback生成回滾語句,完成回滾操作。
1. 查看binlog信息,并對表進行異動操作
mysql> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
|
 mysql-bin.000023 | 4317 |
| mysql-bin.000024 |     11992 |
|
 mysql-bin.000025 | 12180 |
| mysql-bin.000026 |     12049 |
|
 mysql-bin.000027 | 1029 |
| mysql-bin.000028 |       217 |
|
 mysql-bin.000029 | 647 |
| mysql-bin.000030 |       623 |
|
 mysql-bin.000031 | 1409 |
+------------------+-----------+
mysql> update tt set CREATE_TIME =2021-03-25 16:04:00 where TABLE_SCHEMA=sys and TABLE_NAME=waits_global_by_latency;
Query OK, 1 row affected (0.13 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> update tt set CREATE_TIME =2021-03-25 16:04:00 where TABLE_SCHEMA=sys and TABLE_NAME=x$waits_by_user_by_latency;
Query OK, 1 row affected (0.14 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from tt where TABLE_NAME=waits_global_by_latency or TABLE_NAME=x$waits_by_user_by_latency;
+--------------+----------------------------+---------------------+
| TABLE_SCHEMA | TABLE_NAME | CREATE_TIME |
+--------------+----------------------------+---------------------+
| sys | waits_global_by_latency | 2021-03-25 16:04:00 |
| sys | x$waits_by_user_by_latency | 2021-03-25 16:04:00 |
+--------------+----------------------------+---------------------+
2. 查看binlog pos開始620及結束點1409
mysql> show binlog events in mysql-bin.000031;
3. 解析binlog,開始及結束時間點
mysqlbinlog --base64-output=decode-rows -v -v --start-position=620 --stop-position=1409 --database=htest mysql-bin.000031
# at 620
#200324 3:55:21 server id 2330103 end_log_pos 758 CRC32 0xe0578aa4 Rows_query
# update tt set CREATE_TIME =2021-03-25 16:04:00 where TABLE_SCHEMA=sys and TABLE_NAME=waits_global_by_latency
# at 758
#200324 3:55:21 server id 2330103 end_log_pos 811 CRC32 0x9417f454 Table_map: `htest`.`tt` mapped to number 108
# at 811

# at 1079
#200324 3:55:38 server id 2330103 end_log_pos 1220 CRC32 0x066519aa Rows_query
# update tt set CREATE_TIME =2021-03-25 16:04:00 where TABLE_SCHEMA=sys and TABLE_NAME=x$waits_by_user_by_latency
# at 1220
#200324 3:55:38 server id 2330103 end_log_pos 1273 CRC32 0x018171c7 Table_map: `htest`.`tt` mapped to number 108

4. 使用工具binlog-rollbak產生回滾語句

#./binlog_rollback -m file -w rollback -M mysql -t 4 -H xxx.x.0.1 -P 23301 -u root -p system -dbs htest -tbs tt -sdt "2021-03-24 3:55:00" -edt "2021-03-24 3:56:00" -e -f -r 20 -k -b 100 -l 10  -o /tmp/binlog -dj tbs_all_def.json /data/mysql/db_order/blog/mysql-bin.000031
# ll -lth
total 28K
-rw-r--r-- 1 root root 288 Mar 24 04:00 binlog_stats.txt
-rw-r--r-- 1 root root 563 Mar 24 04:00 htest.tt.rollback.31.sql
-rw-r--r-- 1 root root 107 Mar 24 04:00 big_long_trx.txt
-rw-r--r-- 1 root root 64 Mar 24 04:00 ddl_info.txt
-rw-r--r-- 1 root root 492 Mar 24 04:00 tbs_all_def.json
5. 登錄數據庫執行回滾語句,回滾完成
mysql> source /tmp/binlog/htest.tt.rollback.31.sql;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from tt where TABLE_NAME=waits_global_by_latency or TABLE_NAME=x$waits_by_user_by_latency;
+--------------+----------------------------+-------------+
| TABLE_SCHEMA | TABLE_NAME | CREATE_TIME |
+--------------+----------------------------+-------------+
| sys | waits_global_by_latency | NULL |
| sys | x$waits_by_user_by_latency | NULL |
+--------------+----------------------------+-------------+


drop/truncate命令誤刪除表

第二種則是非常糟糕的一種狀況:誤執行了刪除表命令
這種操作會同步應用于備庫,即主備庫會同時缺失數據。
針對此種情況,我們可以通過分三個步驟恢復:
步驟一使用數據庫當日物理備份進行異地恢復
1)復制備份文件至目標端
# pwd
/data/DBbackup/bk_order/20210324/base_20210324
# ls
backup-my.cnf.qp ib_buffer_pool.qp mysql test undo003.qp xtrabackup_info.qp
htest ibdata1.qp performance_schema undo001.qp xtrabackup_binlog_info.qp xtrabackup_logfile.qp

2)解壓縮備份文件

# innobackupex --decompress --parallel=8 .

200324 18:45:30 innobackupex: Starting the decrypt and decompress operation
200324 18:45:32 [06] decompressing ./backup-my.cnf.qp
200324 18:45:32 [02] decompressing ./xtrabackup_info.qp
200324 18:45:32 completed OK!
3)應用數據
# innobackupex --apply-log .
200324 18:46:47 innobackupex: Starting the apply-log operation

IMPORTANT: Please check that the apply-log run completes successfully.
At the end of a successful apply-log run innobackupex
prints "completed OK!".

InnoDB: 5.7.13 started; log sequence number 7385621
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 7385640
200324 18:46:51 completed OK!
4)數據庫恢復
# innobackupex --defaults-file=/data/mysql/db_slave/conf/slave.cnf --copy-back /data/DBbackup/bk_order/20210324/base_20210324

200324 18:49:16 [01] Copying ./ibtmp1 to /data/mysql/db_slave/data/ibtmp1
200324 18:49:16 [01] ...done
200324 18:49:16 completed OK!
5)啟動數據庫,至此數據庫完整恢復完成
#sh startup.sh
# sh login.sh
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 3
Server version: 5.7.25-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>
步驟二:通過邏輯備份恢復單表至生產環境。
1)邏輯備份單表
# mysqldump -uroot -psystem -S 
/data/mysql/db_order/mysql.sock --single-transaction --
default-character-set=utf8 --set-gtid-purged=off --add-drop-
table --triggers --events --routines htest tt>tt.sql

2)傳輸備份文件到目標主機,恢復表

#scp tt.sql mysql@xxx.xxx.xxx.xxx:/tmp
mysql>source /tmp/tt.sql;
步驟三:針對備份時間點后差異的數據,使用工具binlog-rollback生成前滾語句,同步差異數據。
1)使用工具生成前滾語句,注意先確認binlog,pos點信息
# ./binlog_rollback -m repl -w 2sql -M mysql -t 4 -mid 3331 
-H xxx.x.0.1 -P 23301 -u root -p system -dbs htest -tbs tt -
sbin /data/mysql/db_order/blog/mysql-bin.000046 -spos 1551 -
ebin /data/mysql/db_order/blog/mysql-bin.000046 -epos 12722 
-e -f -r 20 -k -b 100 -l 10 -o /tmp/binlog -dj 
tbs_all_def.json
#cd /tmp/binlog
# ls
big_long_trx.txt binlog_stats.txt ddl_info.txt forward htest.tt.forward.46.sql tbs_all_def.json
2)建議先在dba_bak庫(測試庫)恢復表,驗證數據的正確性
mysql>source /tmp/binlog/htest.tt.forward.46.sql;
完成差異恢復。


本文作者:沈亞威(上海新炬王翦團隊)

本文來源:“IT那活兒”公眾號

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/129371.html

相關文章

  • 4.1 開發環境目錄結構配置文件功能梳理-博客后端Api-NodeJs+Express+Mys

    摘要:從本章開始,正式學習如何使用搭建一個博客。但通常我們都會有許多環境,如本地開發環境測試環境和線上環境等,不同的環境的配置不同,我們不可能每次部署時都要去修改引用或者。會根據環境變量的不同從當前執行進程目錄下的目錄加載不同的配置文件。 從本章開始,正式學習如何使用 Nodejs + Express + Mysql 搭建一個博客。 開發環境 首先說下開發環境安裝的核心依賴版本: Node....

    DevWiki 評論0 收藏0

發表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<