當前位置:首頁 » 數據倉庫 » 資料庫如何回滾
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

資料庫如何回滾

發布時間: 2023-04-15 04:19:02

A. oracle 提交數據,怎麼回滾

execute執行後 可以回滾

commit提交後 不可以回滾

其實Oracle提交數據是分兩步操作的,第空者一步execute執行,第二步commit提交。對應的PL\sql也是要先點execute執行,執行後再點commit提交。
但是 commit提交後 可以用閃回查詢恢復原來的數據 因為oracle會將近期的數據保存到快照中 如:

SELECT * FROM TABLE_1 AS OF TIMESTAMP TO_TIMESTAMP('20080606 20:00:00','YYYYMMDD HH24:MI:SS');
這里'20080606 20:00:00'就是你想恢復數據到哪個時間狀態 TABLE_1是資料庫的表名 這樣查詢到斗拿薯的數據就是執行更新操作敏沒之前的數據

B. 如何進行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實例連接地址,用戶名以及資料庫名

C. sql沒有備份文件 如何回滾資料庫前天在資料庫執行了刪除操作後,如何回滾數據,沒有備份文件的

如果是 Oracle , 那麼還有可能, 使用 Flashback Query 恢復得回來。
其他資料庫, 就不大清楚了。

下面是一個 Oracle 恢復的例子:

SQL> CREATE TABLE test_fb_table (
2 ID int,
3 VAL VARCHAR2(10)
4 );
Table created.

SQL> INSERT INTO test_fb_table VALUES (1, 'TEST');
1 row created.
SQL> commit;
Commit complete.

假如 數據被錯誤的刪除/更新
需要檢索某個時間點上,表原有的數據。
SQL> SELECT TO_CHAR(sysdate, 'yyyy-mm-dd hh24:mi:ss') FROM al;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI:SS'
--------------------------------------
2010-11-07 13:01:37

這里刪除掉數據。
SQL> delete from test_fb_table;
1 row deleted.
SQL> commit;
Commit complete.

確認數據已經被刪除。
SQL> select * from test_fb_table;
no rows selected

方法一:
這里檢索出,指定時間點上沖團,指定表的數據情況。
SQL>睜雀 select * from test_fb_table
2 AS OF TIMESTAMP TO_TIMESTAMP('2010-11-07 13:01:37',
3 'yyyy-mm-dd hh24:mi:ss');
ID VAL
---------- --------------------
1 TEST

方法二:
使用 dbms_flashback下面的方法來切換。悉判早
SQL> conn system
Enter password:
Connected.
SQL> select * from hr.test_fb_table;
no rows selected
SQL> execute dbms_flashback.enable_at_time(-
> TO_TIMESTAMP('2010-11-07 13:01:37','yyyy-mm-dd hh24:mi:ss'));
PL/SQL procere successfully completed.
SQL> select * from hr.test_fb_table;
ID VAL
---------- --------------------
1 TEST
SQL> execute dbms_flashback.disable;
PL/SQL procere successfully completed.
SQL> select * from hr.test_fb_table;
no rows selected

D. 請問:C# 在做項目中,如何處理 對資料庫操作的事務回滾

其實回滾簡單理解就是之前操作的反向操作,在addtable1中定義了插入方法,與之相反,神逗棗回滾的話就是定義一種刪除方法,把之前插入的數據刪掉就好了游拆。這個你應該可以做到的吧!
還有給你個忠告,以後做資料庫操作的時候,最好先備份資料庫,這是防止這種情況發生的最簡便的方法。
另外,當你要對資料庫進行相應的操作的時候,提前分析好回滾操作,特別是邏輯,回滾指孫很容易因為邏輯關系似的資料庫面目全非,因為對資料庫的操作很多是在操作時候是1-〉2->3->4這樣的邏輯,回滾的時候就要進行2->1->4->3這樣的邏輯。
如果不行的話再給我留言

E. 對於已經執行成功的sql命令,如何回滾

當啟動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回滾其它的事務

F. sql 回滾語句

事務回滾Transaction Rollback 是指當事務中的某一語句執行失敗時將對資料庫
的操作恢復到事務執行前或某個指定位置.
如:
begin transaction my_transaction_delete
use pangu
go
delete from department
where dept_id = 』1012』
update employee
set dept_id = 』1001』
where dept_id = 』1012』
if @@error!=0 or @@rowcount=0 then
begin
rollback tran after_delete /* 回滾到保存點after_deletereturn,如果使用rollback my_transaction_delete 則會回滾到事務開始前 */
commit tran
print 『更新員工信息表時產生錯誤』
return
end
commit transaction my_transaction_delete
go

G. oracle資料庫庫刪除怎麼回滾

刪除表後,可以採用如下操作:
在 user_recyclebin中找到最近操作過的表名稱,然後用閃回(只能用於10G及以廳罩上版本)。
FLASH BACK TABLE TABLE_NAME TO BEFORE DROP;
如果是刪了或修改裡面的數據,可以先建立一個快表將刪除修改之前狀態的數據找回到這個扮世鬧表返此中:
CREATE TABLE QUICK_TABLE AS
SELECT * FROM TABLE_NAME AS OF TIMESTAMP SYSTEM-1/24 (一小時前的),減去的時間可以自己定。如樓上F_253那位老兄的寫法就不錯,能自由定製時間

H. dbaccess 用dbaccess testdb abc.sql導入腳本後如何回滾資料庫到之前的狀態

informix上執行sql腳本,分命令行方式和dbaccess界面方式:
命令行方式:

dbaccess db_name xx.sql 這里的資料庫名不可省或dbaccess [db_name] < xx.sql輸入重定向方式時,[]表示可省略。當xx.sql腳本中有資料庫選擇語句(database db_name;)時,可以不加資料庫名。

dbaccess界面方式:

運行dbaccess命令,選好資料庫,進入SQL操作界面,菜單如下:SQL: New Run Modify Use-editor Output Choose Save Info Drop Exit可按C選擇Choose命令,進入腳本選擇界面,選擇xx腳本,腳本內容會顯示到sql語句編輯區,可按M進行修改,也可以按R直接運行。

I. mysql如何快速回滾

我們經常會遇到操作一張大表,發現操作時間過長或影響在線業務了,想要回退大表操作的場景。在我們停止大表操作之後,等待回滾是一個很漫長的過程,盡管你可能對知道一些縮短時間的方法,處於對生產環境數據完整性的敬畏,也會選擇不做介入。最終選擇不作為的原因大多源於對操作影響的不確定性。實踐出真知,下面針對兩種主要提升事務回滾速度的方式進行驗證,一種是提升操作可用內存空間,一種是通過停實例,禁用 redo 回滾方式進行進行驗證。

仔細閱讀過官方手冊的同學,一定留意到了對於提升大事務回滾效率,官方提供了兩種方法:一是增加 innodb_buffer_pool_size 參數大小,二是合理利用 innodb_force_recovery=3 參數,跳過事務回滾過程。第一種方式比較溫和,innodb_buffer_pool_size 參數是可以動態調整的,可行性也較高。第二種方式相較之下較暴力,但效果較好。
兩種方式各有自己的優點,第一種方式對線上業務系統影響較小,不會中斷在線業務。第二種方式效果更顯著,會短暫影響業務連續,回滾所有沒有提交的事務。

J. 資料庫如何回滾到指定的批次

可以這樣做:
alter table 表名 enable row movement;
flashback table 表名 to timestamp to_timestamp('2011-03-04 05:00:00','吵絕yyyy-mm-dd HH24:MI:SS');
以上就是需要回滾到某一日期的段碰賀握派方法!