『壹』 如何進行RDS針對資料庫級別的備份及回滾
目前可採取兩種方式:
第一種方式,直接對RDS實例進行庫備份回滾操作
第二種方式,針對備份點生成的臨時實例,對臨時實例進行庫備份,回滾到RDS實例
第一種方式:直接對RDS實例進行庫備份回滾
第一步:在雲伺服器(linux系統)上安裝MySQL客戶端工具
1)下載mysql客戶端工具
執行: wget http //dev mysql com/get/archives/mysql-5.6/MySQL-client-5.6.15-1.linux_glibc2.5.x86_64.rpm
2)安裝mysql客戶端工具
執行:rpm -ivh MySQL-client-5.6.15-1.linux_glibc2.5.x86_64.rpm
或者您可以直接在系統內使用yum install mysql進行安裝MySQL客戶端。
第二步:對RDS實例執行庫備份操作
執行命令完成庫備份:mysqlmp -h xxx.mysql.aliyun.com -u xxx -P 3306 -p --opt --default-character-set=utf8 --triggers --hex-blob db_name > /tmp/db_name.sql
(點擊查看全圖)
輸入密碼後,mysqlmp將進行備份操作並自動完成。
檢測備份生成sql文件,執行 ll xx.sql
第三步:針對RDS實例執行回滾操作
根據備份文件,執行以下命令進行RDS實例回滾操作
mysql -h xxxxxx.mysql.rds.aliyuncs.com -u user_name -P 3306 -p database_name
(點擊查看全圖)
輸入密碼後,將完成回滾操作
第二種方式:針對備份點生成的臨時實例,對臨時實例進行庫備份,回滾到RDS實例
第一步:在雲伺服器(linux系統)上安裝mysql客戶端工具
1)下載mysql客戶端工具
執行: wget http://cdn.mysql.com/Downloads/MySQL-5.5/MySQL-client-5.5.32-2.linux2.6.x86_64.rpm
2)安裝mysql客戶端工具
執行:rpm -ivh MySQL-client-5.5.32-2.linux2.6.x86_64.rpm
第二步:在阿里雲RDS控制台中創建臨時實例
點擊RDS控制台「備份恢復」頁面,選擇一個備份集創建臨時實例,如下圖
(點擊查看全圖)
每個RDS實例可以創建一個臨時實例,臨時實例有隻讀許可權,並且繼承備份點的帳號和密碼以及內外網狀態,創建成功後48個小時內有效
創建臨時實例成功後,在臨時實例列表中可以查看臨時實例信息,如:臨時實例連接字元串,埠號,訪問臨時實例的帳號名(創建備份點時RDS實例中存在的帳號),網路類型等等。
(點擊查看全圖)
第三步:針對子實例進行mysql按庫備份操作
執行以下命令對子實例進行庫備份操作
mysqlmp -h xxx.mysql.aliyun.com -u xxx -P 3306 -p --opt --default-character-set=utf8 --triggers --hex-blob db_name > /tmp/db_name.sql
(點擊查看全圖)
輸入密碼後,完成子實例的備份操作。
註:上圖紅色圈內應輸入子實例的連接地址,用戶名以及資料庫名
第四步:針對RDS實例進行回滾操作
執行以下命令對RDS實例進行回滾操作
mysql-h xxxxxx.mysql.rds.aliyuncs.com -u xxxx -P 3306 -p database_name
(點擊查看全圖)
輸入密碼後,完成RDS實例的回滾操作
註:上圖紅色圈內應輸入RDS實例連接地址,用戶名以及資料庫名
『貳』 回滾快照,是先滾數據盤呢還是先滾系統盤
1、關閉當前系統
我們需要先停止當前的伺服器,要不無法選擇安裝新系統。
2、選擇需要重置的系統安裝
我們找到更換系統盤的鏈接,然後選擇需要的鏡像、設置ROOT密碼。
設置完畢之後我們點擊按鈕確定就可以,等待自動安裝新系統。安裝完畢之後就可以通過SSH登入賬戶重新安裝配置系統環境。如果我們伺服器中有重要數據,要記得備份數據、快照備份等操作,因為重置系統後數據會全部丟失。
阿里雲ECS伺服器快照備份與回滾恢復數據
我們大部分用戶都是從虛擬主機過度到使用VPS、雲主機上來的,肯定深知網站數據的重要性,在使用虛擬主機的時候我們可能會依賴主機商的定期備份,基本上靠譜的服務商都是會幫助我們備份的,即便我們使用到雲主機時代,理論上服務商也會有幫助備份,但是真丟失後需要找回或者還原數據還是比較困難,畢竟不是針對我們某個VPS的備份,大部分時候我們需要自己備份網站或者伺服器快照備份。
與很多服務商一樣,阿里雲ECS擁有快速的快照備份,目前快照備份是免費的,老左有看到目前每天還會幫助我們自動快照備份一次。所謂快照備份就是包括我們的環境與數據一起備份,如果伺服器操作失誤或者網站數據需要恢復,直接可以將所有系統全部還原的功能。
1、設置自定快照備份策略
理論上每天會自動幫助我們備份一次,但是如果遇到特殊的變動,我們還是自己手工備份。
我們需要先停止當前的伺服器,要不無法選擇安裝新系統。
2、選擇需要重置的系統安裝
我們可以根據快照備份的標簽,然後選擇回滾磁碟,在整個回滾過程中,我們都要暫停當前運行,然後再點擊回滾磁碟,如果我們有數據盤的可以分別選擇數據盤還是系統盤。
PS:如果我們是網站項目的話,雖然快照備份很好,但是他是連帶環境一起備份的,數據的單獨遷移不好把控,所以我們自己也需要定期進行單獨網站文件和資料庫的備份本地。
『叄』 java在交易過程伺服器掛掉怎麼回滾
java中交易操作可以在service層做事務,要提交一起提交,或者都不提交,如果伺服器掛掉,那就是沒有提交成功,不會有影響,都不操作就相當於回滾
『肆』 mysql命令行下怎樣實現數據的回滾操作
當啟動Binlog後,事務會產生Binlog Event,這些Event被看做事務數據的一部分。因此要保證事務的Binlog Event和InnoDB引擎中的數據的一致性。所以帶Binlog的CrashSafe要求MySQL宕機重啟後能夠保證:
- 所有已經提交的事務的數據仍然存在。
- 所有沒有提交的事務的數據自動回滾。
- 所有已經提交了的事務的Binlog Event也仍然存在。
- 所有沒有提交事務沒有記錄Binlog Event。
這些要求很好理解,如果重啟後數據還在,但是Binlog Event沒有了,就沒辦法復制到其他節點上了。如果重啟後,數據沒了,但是Binlog Event還在,那麼不存在的數據就會被復制到其他節點上,從而導致主從的不一致。
為了保證帶Binlog的CrashSafe,MySQL內部使用的兩階段提交(Two Phase Commit)。
2 - MySQL的Two Phase Commit(2PC)
在開啟Binlog後,MySQL內部會自動將普通事務當做一個XA事務來處理:
- 自動為每個事務分配一個唯一的ID
- COMMIT會被自動的分成Prepare和Commit兩個階段。
- Binlog會被當做事務協調者(Transaction Coordinator),Binlog Event會被當做協調者日誌。
想了解2PC,可以參考文檔:【https://en.wikipedia.org/wiki/Two-phase_commit_protocol。】
- 分布式事務ID(XID)
使用2PC時,MySQL會自動的為每一個事務分配一個ID,叫XID。XID是唯一的,每個事務的XID都不相同。XID會分別被Binlog和InnoDB記入日誌中,供恢復時使用。MySQ內部的XID由三部分組成:
- 前綴部分
前綴部分是字元串"MySQLXid"
- Server ID部分
當前MySQL的server_id
- query_id部分
為了保證XID的的唯一性,數字部分使用了query_id。MySQL內部會自動的為每一個語句分配一個query_id,全局唯一。
參考代碼:sql/xa。h的struct xid_t結構。
- 事務的協調者Binlog
Binlog在2PC中充當了事務的協調者(Transaction Coordinator)。由Binlog來通知InnoDB引擎來執行prepare,commit或者rollback的步驟。事務提交的整個過程如下:
1. 協調者准備階段(Prepare Phase)
告訴引擎做Prepare,InnoDB更改事務狀態,並將Redo Log刷入磁碟。
2. 協調者提交階段(Commit Phase)
2.1 記錄協調者日誌,即Binlog日誌。
2.2 告訴引擎做commit。
注意:記錄Binlog是在InnoDB引擎Prepare(即Redo Log寫入磁碟)之後,這點至關重要。
在MySQ的代碼中將協調者叫做tc_log。在MySQL啟動時,tc_log將被初始化為mysql_bin_log對象。參考sql/binlog.cc中的init_server_components():
if (opt_bin_log) tc_log= &mysql_bin_log;
而在事務提交時,會依次執行:
tc_log->prepare();
tc_log->commit();
參考代碼:sql/binlog.cc中的ha_commit_trans()。當mysql_bin_log是tc_log時,prepare和commit的代碼在sql/binlog.cc中:
MYSQL_BIN_LOG::prepare();
MYSQL_BIN_LOG::commit();
-協調者日誌Xid_log_event
作為協調者,Binlog需要將事務的XID記入日誌,供恢復時使用。Xid_log_event有以下幾個特點:
- 僅記錄query_id
因為前綴部分不變,server_id已經記錄在Event Header中,Xid_log_event中只記錄query_id部分。
- 標志事務的結束
在Binlog中相當於一個事務的COMMIT語句。
一個事務在Binlog中看起來時這樣的:
Query_log_event("BEGIN");DML產生的events; Xid_log_event;
- DDL沒有BEGIN,也沒有Xid_log_event 。
- 僅InnoDB的DML會產生Xid_log_event
因為MyISAM不支持2PC所以不能用Xid_log_event ,但會有COMMIT Event。
Query_log_event("BEGIN");DML產生的events;Query_log_event("COMMIT");
問題:Query_log_event("COMMIT")和Xid_log_event 有不同的影響嗎?
- Xid_log_event 中的Xid可以幫助master實現CrashSafe。
- Slave的CrashSafe不依賴Xid_log_event
事務在Slave上重做時,會重新產生XID。所以Slave伺服器的CrashSafe並不依賴於Xid_log_event 。Xid_log_event 和Query_log_event("COMMIT"),只是作為事務的結尾,告訴Slave Applier去提交這個事務。因此二者在Slave上的影響是一樣的。
3 - 恢復(Recovery)
這個機制是如何保證MySQL的CrashSafe的呢,我們來分析一下。這里我們假設用戶設置了以下參數來保證可靠性:
- 恢復前事務的狀態
在恢復開始前事務有以下幾種狀態:
- InnoDB中已經提交
根據前面2PC的過程,可知Binlog中也一定記錄了該事務的的Events。所以這種事務是一致的不需要處理。
- InnoDB中是prepared狀態,Binlog中有該事務的Events。
需要通知InnoDB提交這些事務。
- InnoDB中是prepared狀態,Binlog中沒有該事務的Events。
因為Binlog還沒記錄,需要通知InnoDB回滾這些事務。
- Before InnoDB Prepare
事務可能還沒執行完,因此InnoDB中的狀態還沒有prepare。根據2PC的過程,Binlog中也沒有該事務的events。 需要通知InnoDB回滾這些事務。
- 恢復過程
從上面的事務狀態可以看出:恢復時事務要提交還是回滾,是由Binlog來決定的。
- 事務的Xid_log_event 存在,就要提交。
- 事務的Xid_log_event 不存在,就要回滾。
恢復的過程非常簡單:
- 從Binlog中讀出所有的Xid_log_event
- 告訴InnoDB提交這些XID的事務
- InnoDB回滾其它的事務