故障分析 | replace into 導致主備不一致
網名“北在南方”,資深 DBA,主要負責資料庫架構設計和運維平臺開發工作,擅長資料庫效能調優、故障診斷。
一 介紹
二 案例分析
在主庫上操作
root@test 12:36:51>show create table t1 \G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
root@test 12:37:41>insert into t1(name) values('a')
此時檢查主備庫上 t1 的表結構都是一樣的,AUTO_INCREMENT 都是2.
root@test 12:37:51>show create table t1 \G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
在主庫上進行 replace into 操作
root@test 12:37:58>replace into t1(name) values('a');
root@test 12:38:40>replace into t1(name) values('a');
root@test 12:38:49>select * from t1;
+----+------+
| id | name |
+----+------+
| 3 | a |
+----+------+
1 row in set (0.00 sec)
此時檢查主庫中 t1 表結構,請注意 AUTO_INCREMENT=4
root@test 12:38:51>show create table t1 \\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
從庫上 t1 的表結構 ,AUTO_INCREMENT=2
oot@test 12:39:35>show create table t1 \G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
root@test 12:39:43>select * from t1;
+----+------+
| id | name |
+----+------+
| 3 | a |
+----+------+
1 row in set (0.00 sec)
分析
三 風險點
如果主備庫發生主從切換,備庫變為原來的主庫,按照原來的業務邏輯再往下會發生什麼?
root@test 12:40:46>replace into t1(name) values('a');
Query OK, 2 rows affected (0.00 sec)
root@test 12:40:48>select * from t1;
+----+------+
| id | name |
+----+------+
| 2 | a | ---id由原來的3變成了2.
+----+------+
1 row in set (0.00 sec)
四 總結
由於 replace into 操作在遇到主鍵衝突的時候會修改主鍵的值,所以如果業務邏輯強依賴自增 ID ,絕對不要用 replace ,普通環境也不建議這樣用,因為 replace into 操作可能會導致主鍵的重新組織。
本文關鍵字:#故障分析# #MySQL#
MySQL 8.0 對 limit 的最佳化
從 data_free 異常說起
再說 order by 最佳化技術分享 | 一文了解高併發限流演算法
關於SQLE
愛可生開源社群的 SQLE 是一款面向資料庫使用者和管理者,支援多場景稽核,支援標準化上線流程,原生支援 MySQL 稽核且資料庫型別可擴充套件的 SQL 稽核工具。
型別 | 地址 |
---|---|
版本庫 | |
文件 | |
釋出資訊 | /releases |
資料稽核外掛開發文件 | 3.modules/3.7_auditplugin/auditplugin_development.html |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024924/viewspace-2927000/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 故障分析 | DDL 導致的 Xtrabackup 備份失敗
- 故障分析 | 手動 rm 掉 binlog 導致主從報錯
- MYSQL 主從不一致的原因分析MySql
- 故障分析 | MySQL : slave_compressed_protocol 導致 crashMySqlProtocol
- MySQL 主從 AUTO_INCREMENT 不一致問題分析MySqlREM
- 主備庫記憶體不一致的Data Guard環境搭建記憶體
- 子游標過多導致大量mutex爭用故障分析Mutex
- str_replace導致的注入問題彙總
- 時區不一致導致spring應用異常Spring
- 故障分析 | MySQL 5.7 使用臨時表導致資料庫 CrashMySql資料庫
- strict weak ordering導致公司級故障
- ODPS主備叢集雙向資料複製導致主備中心網路打爆問題
- LF和CRLF換行符不一致導致的Git顯示修改問題分析及解決Git
- 資料庫主從不一致,怎麼解?資料庫
- 《MySQL主從不一致情形與解決方法》MySql
- MySQL主從不一致情形與解決方法MySql
- MySQL主從資料不一致,怎麼辦?MySql
- 故障分析 | MySQL convert 函式導致的字符集報錯處理MySql函式
- 故障分析 | 大量短時程式導致 cpu 負載過高案例一則負載
- 案例:DG主庫未設定force logging導致備庫壞塊
- Git因換行符不一致導致反覆有修改記錄Git
- 故障分析 | 血的教訓-由慢查詢引發的備份等待導致資料庫連線打滿資料庫
- pymysql 非執行緒安全導致的故障.MySql執行緒
- 小程式渲染層核心不一致導致Array.flat()不可用
- PostgreSQL問題分析1:時間線不一致SQL
- BUG—Nuget包版本不一致導致程式行為與預期不符
- Oracle RAC日常運維-NetworkManager導致叢集故障Oracle運維
- Binlog多大導致主從中斷
- 故障分析 | MySQL 從機故障重啟後主從同步報錯案例分析MySql主從同步
- ZooKeeper 避坑指南: ZooKeeper 3.6.4 版本 BUG 導致的資料不一致問題
- 故障分析 | Redis 主從複製風暴Redis
- mysql雙寫造成主從資料不一致的實驗MySql
- 執行SQL查詢導致磁碟耗盡故障演示SQL
- ORA-19909(一次DataGuard Failover導致的故障AI
- SANGFOR NGAF雙機主備專線故障的排查
- 4.2.13 主備庫實現自動故障轉移
- undo truncate 導致qps下降分析
- impdp導致主鍵索引的變化索引