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……
如果在生產環境中使用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