1. 程式人生 > >mysql資料庫資料的刪除與恢復

mysql資料庫資料的刪除與恢復

Part 1 刪除資料, truncate 和 delete  的區別

  • truncate是整體刪除(速度較快), delete是逐條刪除(速度較慢)。
  • truncate不寫伺服器log,delete寫伺服器log,也就是truncate效率比delete高的原因;(delete 不帶where 的語句不寫日誌)
  • truncate不啟用trigger(觸發器),但是會重置Identity(標識列、自增欄位),相當於自增列會被置為初始值,又重新從1開始記錄,而不是接著原來的ID數。而delete刪除以後,Identity依舊是接著被刪除的最近的那一條記錄ID加1後進行記錄。
  • 如果只需刪除表中的部分記錄,只能使用DELETE語句配合where條件。 DELETE FROM wp_comments WHERE……
Part 2 msql下對沒有where語句的delete和update做限制

如果在生產環境中使用UPDATE,DELETE語句操作資料,此時如果忘記攜帶本應該新增的WHERE條件,後果可能不堪設想。在正常的業務情況,也不會更新或者刪除所有的記錄

1. 阻止update設定(sql_safe_updates)

sql_safe_updates這個MySQL自帶的引數就可以完美的解決我們的問題,並且該引數是可以線上變更的哦~當該引數開啟的情況下,你必須要在UPDATE語句後攜帶WHERE條件,否則就會報出ERROR。。

# sql_safe_updates=0,即未開啟
[email protected] : test 07:58:34> set sql_safe_updates=0; Query OK, 0 rows affected (0.00 sec) [email protected] : test 07:58:43> show variables like 'sql_safe_updates'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | sql_safe_updates | OFF | +------------------+-------+ 1 row in set (0.00 sec) # sql_safe_updates=1,即開啟
[email protected]
127.0.0.1 : test 08:00:00> set sql_safe_updates=1; Query OK, 0 rows affected (0.00 sec) [email protected] : test 08:00:11> show variables like 'sql_safe_updates'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | sql_safe_updates | ON | +------------------+-------+ 1 row in set (0.00 sec) [email protected] : test 08:00:27> update t set aaa='aaa'; ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

如上屬的例子所示,當引數sql_safe_updates開啟的時候,UPDATE語句不攜帶WHERE條件將會爆出一個錯誤。

2. 阻止delete設定

直接限制mysql刪除
啟動MySQL的時候加上引數 -U
-U, --safe-updates  Only allow UPDATE and DELETE that uses keys.
他的作用是防止執行delete的時候沒帶有條件語句,如果沒加上where則語句不執行。


 在資料庫日常維護中,開發人員是最讓人頭痛的,很多時候都會由於SQL語句寫的有問題導致伺服器出問題,導致資源耗盡。最危險的操作就是在做DML操作的時候忘加where條件,導致全表更新,這是作為運維或者DBA的我們改如何處理呢?下面我分別針對update和delete操作忘加where條件導致全表更新的處理方法。

一. update 忘加where條件誤操作恢復資料(binglog格式必須是ROW)

1.建立測試用的資料表

複製程式碼
mysql> create table t1 (
    -> id int unsigned not null auto_increment,
    -> name char(20) not null,
    -> sex enum('f','m') not null default 'm',
    -> address varchar(30) not null,
    -> primary key(id)
    -> );
Query OK, 0 rows affected (0.31 sec)
mysql
>
複製程式碼

2.插入測試資料

複製程式碼
mysql> insert into t1 (name,sex,address)values('daiiy','m','guangzhou');
Query OK, 1 row affected (0.01 sec)

mysql> insert into t1 (name,sex,address)values('tom','f','shanghai');   
Query OK, 1 row affected (0.00 sec)

mysql> insert into t1 (name,sex,address)values('liany','m','beijing'); 
Query OK, 1 row affected (0.00 sec)

mysql> insert into t1 (name,sex,address)values('lilu','m','zhuhai');  
Query OK, 1 row affected (0.05 sec)

mysql> 
複製程式碼

3.現在需要將id等於2的使用者的地址改為zhuhai,update時沒有新增where條件

複製程式碼
mysql> select * from t1;
+----+-------+-----+-----------+
| id | name  | sex | address   |
+----+-------+-----+-----------+
|  1 | daiiy | m   | guangzhou |
|  2 | tom   | f   | shanghai  |
|  3 | liany | m   | beijing   |
|  4 | lilu  | m   | zhuhai    |
+----+-------+-----+-----------+
4 rows in set (0.01 sec)

mysql> update t1 set address='zhuhai';
Query OK, 3 rows affected (0.09 sec)
Rows matched: 4  Changed: 3  Warnings: 0

mysql> select * from t1;              
+----+-------+-----+---------+
| id | name  | sex | address |
+----+-------+-----+---------+
|  1 | daiiy | m   | zhuhai  |
|  2 | tom   | f   | zhuhai  |
|  3 | liany | m   | zhuhai  |
|  4 | lilu  | m   | zhuhai  |
+----+-------+-----+---------+
4 rows in set (0.00 sec)

mysql> 
複製程式碼

4.開始恢復,在線上的話,應該比較複雜,要先進行鎖表,以免資料再次被汙染。(鎖表,檢視正在寫哪個二進位制日誌)

複製程式碼
mysql> lock tables t1 read ;
Query OK, 0 rows affected (0.00 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000024 |     1852 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

mysql> 
複製程式碼

5.分析二進位制日誌,並且在其中找到相關記錄,在更新時是address='zhuhai',我們可以在日誌中過濾出來。

[[email protected] mysql]# mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000024 | grep -B 15 'zhuhai'
複製程式碼
# at 1629
# at 1679
#140305 10:52:24 server id 1  end_log_pos 1679  Table_map: `db01`.`t1` mapped to number 38
#140305 10:52:24 server id 1  end_log_pos 1825  Update_rows: table id 38 flags: STMT_END_F
### UPDATE db01.t1
### WHERE
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='daiiy' /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=2 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
###   @4='guangzhou' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
### SET
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='daiiy' /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=2 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
###   @4='zhuhai' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
### UPDATE db01.t1
### WHERE
###   @1=2 /* INT meta=0 nullable=0 is_null=0 */
###   @2='tom' /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
###   @4='shanghai' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
### SET
###   @1=2 /* INT meta=0 nullable=0 is_null=0 */
###   @2='tom' /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
###   @4='zhuhai' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
### UPDATE db01.t1
### WHERE
###   @1=3 /* INT meta=0 nullable=0 is_null=0 */
###   @2='liany' /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=2 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
###   @4='beijing' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
### SET
###   @1=3 /* INT meta=0 nullable=0 is_null=0 */
###   @2='liany' /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=2 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
###   @4='zhuhai' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
複製程式碼

可以看見裡面記錄了每一行的變化,這也是binglog格式要一定是row才行的原因。其中@1,@2,@3,@4,分別對應表中id,name,sex,address欄位。相信大家看到這裡有點明白了吧,對,沒錯,你猜到了,我們將相關記錄轉換為sql語句,重新匯入資料庫。

相關推薦

mysql資料庫資料備份恢復

1、通過物理拷貝備份與恢復          對MyISAM引擎的表來說:如果當前此表在拷貝過程中沒有任何寫操作時,可以直接拷貝,對單張表拷貝時只需把把表相關的三個以.frm,.MYD,.MYI結尾的檔案拷貝到另外的

MySQL 資料庫增量備份恢復資料命令實戰

1. 備份單個數據庫練習 mysqldump 命令多種引數的使用 1.1 調整 MySQL 客戶端及服務端字符集為建庫建表時預設的 latin1,避免備份時的亂碼問題 [[email protected] ~]# vi /etc/my.cnf [[email protected] ~

Linux中MySql資料庫的備份恢復

1、登入資料庫,並檢視已有資料庫(以root使用者登入密碼123) 2、在test下建立一個students表格(可省略) 3、為test備份(備份到當前路徑) 4、我們將原資料庫刪除並檢視資料庫是否刪除成功 5、恢復資料載入備份資料庫(備份

使用Java實現Mysql資料庫的備份恢復

廢話不多說,直接上程式碼,如下示例: public class DatabaseUtil { public static void main(String[] args) throws Exception { //測試備份 Stri

mysql資料庫資料刪除恢復

Part 1 刪除資料, truncate 和 delete  的區別 truncate是整體刪除(速度較快), delete是逐條刪除(速度較慢)。truncate不寫伺服器log,delete寫伺服器log,也就是truncate效率比delete高

mysql資料庫的備份還原(誤刪除恢復)

第一步:備份資料庫 mysqldump -uroot -proot test-l -F > '../data/test.sql' 此條語句將當前庫儲存到test.sql, -F引數表示flush logs,會重置binlog檔案,檢視新的binlo

ZT:mysql資料庫刪除後的資料恢復操作說明

在日常運維工作中,對於mysql資料庫的備份是至關重要的!資料庫對於網站的重要性使得我們對mysql資料的管理不容有失! 然後,是人總難免會犯錯誤,說不定哪天大腦短路了來個誤操作把資料庫給刪除了,怎麼辦??? 下面,就mysql資料庫誤刪除後的恢復方案進行說明。

mysql 操作資料庫(備份恢復

一、直接把建立資料庫的語句放到sql 檔案中: php 寫法: <?php    $mysql_port = get_mysql_port();   $cmd = US_MYSQL_BIN."/mysql.exe --port=".

利用binlog恢復mysql資料庫資料

前提:mysql資料庫開啟了binlog日誌      通過  show variables like 'log_%'; 檢視是否開啟binlog日誌。      操作步驟:     在資料庫中

Mysql資料庫——資料表的優化、外來鍵三正規化

資料表優化 將商品資訊表進行優化 1.建立商品種類表: create table if not exists goods_cates( id int unsigned primary key auto_increment, name

MySQL之終端下對資料的匯入匯出、賬戶管理、資料備份恢復

資料匯入 將檔案系統中的內容匯入的資料庫中 語法格式: load data infile '檔名' into table 表名 fields terminated by "分隔符" lines terminated by '\n'; 倒數第二行是:在

使用.iba檔案恢復mysql資料庫資料

在liunx上操作的 測試資料庫名稱:testdb 恢復的表名:testtable 1、停止mysql  (service mysqld stop)服務,my.conf 加上    innodb_force_recovery=1 ,啟動mysql  (service

mysql資料備份恢復

#資料備份 或 恢復 #將classwork的資料備份到F盤 檔案命名為classwork.sql doc命令 #預設方式備份 mysqldump -uroot -proot function_cl

MySQL資料庫學習——約束資料表修改

一、約束:保證資料的完整性和一致性,約束分為列級約束和表級約束 約束種類:not null(非空約束),primary key(主鍵約束),uniquekey(唯一約束),default(預設約束),foreign key(外來鍵約束)。 二、外來鍵約束:用於保證資料的

ubuntu系統tmp資料夾內檔案重啟自動刪除恢復

ubuntu系統下tmp資料夾下檔案一般預設重啟自動刪除 當然你可以更改這些設定 像我剛開始不知道,東西放裡面,重啟不見了。。。很抓狂。。。 當然如果不小心很重要東西放裡面重啟消失了怎麼恢復呢? 這裡用的是extundelete這個軟體,安裝直接:sudo apt-get

mysql中如何使用linux命令對資料庫進行備份恢復

在視覺化介面上很方便對資料庫進行備份和恢復,那麼在如何使用linux命令對資料庫進行備份和恢復呢?首先需要我們退出mysql,然後按如下步驟操作。1、從linux命令列中輸入sudo -s 進入超級管理員模式;2、進入mysql根目錄,即在命令列輸入 cd /var/lib/

我的Python成長之路--Day48--mysql高階(檢視、觸發器、事物、儲存過程、函式、流程控制、資料備份恢復)

目錄 1、檢視 2、觸發器 3、事物 自定義函式 1、檢視 1.1、什麼是檢視 檢視是一張表或者多張表的查詢結果構成的一張虛擬表

python-day47--mysql數據備份恢復

建庫 eat 系統 mys creat windows option 導出 目標 一、IDE工具介紹 掌握: #1. 測試+鏈接數據庫 #2. 新建庫 #3. 新建表,新增字段+類型+約束 #4. 設計表:外鍵 #5. 新建查詢 #6. 備份庫/表 #註意: 批量加註釋

MySQL 數據備份恢復

mar target 備份與恢復 bsp 恢復 art sql get mysql mysqldump 數據備份與恢復 mysqlbinlog 數據增量恢復 MySQL 數據備份與恢復

DBA成長之路---mysql數據備份恢復

insert describe status use 表結構 command osi 5.7 數據 數據備份與恢復備份方式: 物理備份:直接拷貝備份庫和表對應的文件 cp -r /var/lib/mysql/mysql /mysql.bak