chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

MySQL 8.0/8.4執(zhí)行DDL丟數(shù)據(jù)有什么影響

OSC開源社區(qū) ? 來源:OSC開源社區(qū) ? 2024-12-24 09:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

問題是有,但好在規(guī)避辦法也比較簡單,影響也有限。

先說解決辦法,從簡單到麻煩:

執(zhí)行 ALTER TABLE 時,顯式指定ALGORITHM=INSTANT/COPY,反正不要使用 INPLACE。

適當調大 innodb_ddl_buffer_size 參數(shù)值,其默認值1MB,例如調大到100MB就可以應對大部分業(yè)務表的DDL操作場景。

利用 pt-osc 或 gh-ost 等工具進行 Online DDL 操作。

在業(yè)務低谷時段執(zhí)行DDL操作,有條件的話甚至可以在業(yè)務維護期間再執(zhí)行DDL操作。

升級版本到已修復的 Percona 分支版本(下文會提到)。

問題來源

在 MySQL 8.0.27 版本中新增并行DDL功能后才“引入”了這個問題。目前在最新的 8.1.x/8.3.x/8.3.x/8.4.x/9.0.x/9.1.x 等版本中依然存在,預計到 MySQL 8.0.41 新版本會修復。

For online DDL operations, storage is usually the bottleneck. To address this issue, CPU utilization and index building has been improved. Indexes can now be built simultaneously instead of serially. Memory management has also been tightened to respect memory configuration limits set by the user.

詳見:https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-27.html

觸發(fā)原因:在INPLACE模式的DDL操作中重建主鍵索引時,因錯誤處理會略過部分記錄,導致數(shù)據(jù)丟失。

觸發(fā)條件:只影響INPLACE模式的DDL操作,不影響COPY和INSTANT模式的DDL操作。以下是幾種常見的可能觸發(fā)問題的DDL操作場景:

場景1:ALTER TABLE ENGINE=INNODB 重整表空間操作,需要重建主鍵索引。

場景2:ALTER TABLE ADD NEW-COL ...,ALGORITHM=INPLACE,新增列操作,因指定了INPLACE模式,需要重建主鍵索引。

其他例如INSTANT模式加新字段,增刪索引則不會觸發(fā)該問題。

關于該問題的詳細解讀詳見幾篇文章:

八怪老師推文 https://www.jianshu.com/p/c66fe0349345?v=1734349439280 。

Rex老師推文 MySQL 8.4-LTS DDL會導致數(shù)據(jù)丟失。

丁奇老師推文 丟數(shù)據(jù)風險 @ MySQL官方最新版。

Percona 推文 Who Ate My MySQL Table Rows?。

涉及到2個MySQL bug:

DDL 丟數(shù)風險:https://bugs.mysql.com/bug.php?id=115608

DDL 重復行報錯:https://bugs.mysql.com/bug.php?id=115511

該問題核心就存在于如果涉及到需要用INPLACE算法重建主鍵索引的DDL操作,就需要在 innodb_ddl_buffer_size 用滿后直接插入到 #sql-ibXXX 數(shù)據(jù)文件中,這個時候可能正在page的中間的某個位置,插入的時候會暫時放棄page上的mutex,并且保存游標到持久游標,然后插入數(shù)據(jù),插入完成后再從持久游標恢復游標。這樣做的目的可能是為了提高page修改的并發(fā),但是這里保存和恢復持久游標卻出了問題,主要是page中的數(shù)據(jù)可能出現(xiàn)修改,這種修改對應了前面的2個BUG:

Purge線程,清理del flag。

其他線程INSERT了數(shù)據(jù)。

具體游標的保存和恢復出現(xiàn)的問題,可以參考Rex老師的文章 MySQL 8.4-LTS DDL會導致數(shù)據(jù)丟失。

問題影響

目前該問題已知影響的版本列表如下:

MySQL 8.0.x 系列版本中,所有 >= 8.0.27 的 MySQL 8.0.x 版本;

所有 8.4.x 系列 LTS 版本;

Percona Server for MySQL 中從 8.0.27-18 至 8.0.37-29,以及 8.4.0-1 版本。

Percona XtraDB Cluster 中從 8.0.27-18.1 至 8.0.37-29,以及 8.4.0-1 版本。

未受影響或已修復的版本列表如下:

所有早于 MySQL 8.0 的版本,及 MySQL 5.6、5.7 等版本,以及 Percona 5.6、5.7 版本;

Percona 8.0 系列中 8.0.39-30 及更高版本;

Percona 8.4 系列中 8.4.2-2 及更高版本;

Percona XtraDB Cluster 8.0 系列中 8.0.39-30 及更高版本。

目前所有活躍的 MySQL 版本均未修復,已安排在MySQL 8.0.41版本修復該問題。GreatSQL也會在下一個新版本中修復該問題。

問題復現(xiàn)/模擬

模擬測例1

經過測試,該問題觸發(fā)概率和 update/delete 并發(fā)負載有關,結合 MySQL bug #113812 提供的案例,我進行了簡化和改造,測試用例如下:

#/bin/sh
#bugtest.sh,測例1
#需要先安裝mysql_random_data_load測試工具
#通過socket方式連接MySQL時用root密碼并且是空密碼
MYSQL="mysql-N-s-uroot-S/data/MySQL/mysql.sock"
HOST=127.0.0.1
PORT=3306
USER="yejr"
PWD="yejr"

echo"1.Preparework"

read-r-d''bugSQL<<-EOSQL?||?true
CREATE?DATABASE?IF?NOT?EXISTS?test;
USE?test;
DROP?TABLE?IF?EXISTS?t1;
CREATE?TABLE?IF?NOT?EXISTS?t1(
?id?int?not?null,
?c1?varchar(20)?not?null,
?c2?varchar(30)?not?null,
?c3?datetime?not?null,
?c4?varchar(30)?not?null,
?PRIMARY?KEY?(id),
?KEY?idx_c3?(c3)
)?ENGINE=InnoDB;

CREATE?USER?IF?NOT?EXISTS?'${USER}'@'%';
ALTER?USER?'${USER}'@'%'?IDENTIFIED?BY?'${PWD}';
GRANT?ALL?PRIVILEGES?ON?test.t1?TO?'${USER}'@'%';
EOSQL

${MYSQL}?-f?-e?"${bugSQL}"

echo?"2.?Starting?run?test"

${MYSQL}?-e?"truncate?table?test.t1;"

for?i?in?{1..1000}
do
?mysql_random_data_load?-u${USER}?-p${PWD}?-h${HOST}?-P${PORT}?--max-threads=2?test?t1?1000?>/dev/null2>&1
c_before_del=`${MYSQL}-e"selectcount(*)fromtest.t1;"`
c_delete=`${MYSQL}-e"selectcount(*)fromtest.t1wherec3

執(zhí)行該測試用例腳本,當發(fā)現(xiàn)有問題時,結果顯式如下:

$sh./bugtest.sh
1.Preparework
2.Startingruntest
run10times
run20times
run30times
...
run175times,delete:979,beforealter:3436,afteralter:3435

這就表示執(zhí)行到第175次后觸發(fā)問題,發(fā)現(xiàn)丟了一條記錄。在這個測例中,如果加大 innodb_ddl_buffer_size 參數(shù)值到10MB,則不再觸發(fā)問題。

模擬測例2

對上面的測試用例再進行調整后,改成下面這個測例,在執(zhí)行完1000次后仍未觸發(fā)問題(可見并不總是會觸發(fā)問題,只有個別情況下會踩雷):

#!/bin/sh
#bugtest.sh,測例2
#需要先安裝mysql_random_data_load測試工具
#通過socket方式連接MySQL時用root密碼并且是空密碼
MYSQL="mysql-N-s-uroot-S/nvme/GreatSQL/mysql.sock"
HOST=127.0.0.1
PORT=3306
USER="yejr"
PWD="yejr"

echo"1.Preparework"

read-r-d''bugSQL<<-EOSQL?||?true
CREATE?DATABASE?IF?NOT?EXISTS?test;
USE?test;
DROP?TABLE?IF?EXISTS?t1;
CREATE?TABLE?IF?NOT?EXISTS?t1(
?id?int?not?null,
?c1?varchar(20)?not?null,
?c2?varchar(30)?not?null,
?c3?int?not?null,
?c4?varchar(30)?not?null,
?PRIMARY?KEY?(id),
?KEY?idx_c3?(c3)
)?ENGINE=InnoDB;

CREATE?USER?IF?NOT?EXISTS?'${USER}'@'%';
ALTER?USER?'${USER}'@'%'?IDENTIFIED?BY?'${PWD}';
GRANT?ALL?PRIVILEGES?ON?test.t1?TO?'${USER}'@'%';
EOSQL

${MYSQL}?-f?-e?"${bugSQL}"

echo?"2.?Starting?run?test"

${MYSQL}?-e?"truncate?table?test.t1;"

for?i?in?{1..300}
do
?mysql_random_data_load?-u${USER}?-p${PWD}?-h${HOST}?-P${PORT}?--max-threads=2?test?t1?1000?>/dev/null2>&1
c_before_del=`${MYSQL}-e"selectcount(*)fromtest.t1;"`
${MYSQL}-e"deletefromtest.t1LIMIT980;"
c_before_alter=`${MYSQL}-e"selectcount(*)fromtest.t1;"`
${MYSQL}-e"altertabletest.t1engine=innodb;"
c_after_alter=`${MYSQL}-e"selectcount(*)fromtest.t1;"`
if[${c_before_alter}-ne${c_after_alter}];then
echo"run${i}times,beforealter:${c_before_alter},afteralter:${c_after_alter}"
exit
fi
if[`expr${i}%10`-eq0];then
echo"run${i}times"
fi
done

從多次反復測試的結果來看,大致的規(guī)律是當執(zhí)行 ALTER TABLE 操作特別頻繁時,就可能會在表重建時遇到被 Purge 的記錄還沒來得及被抹掉,這就比較容易觸發(fā)問題。試著把上面的測例1做些微調,把 ALTER TABLE 這部分的處理邏輯修改成下面這樣:

...
47if[`expr${i}%20`-eq0];then
48sleep2
49${MYSQL}-e"altertabletest.t1engine=innodb;"
50fi
...

即每完成20輪測試后再執(zhí)行 ALTER TABLE 操作,并且在此之前還要先休眠等待2秒。改用新邏輯后,就沒再觸發(fā)問題。

模擬測例3

提示:該測例需要改成MySQL debug版本運行(平時使用的是release二進制包,是無法復現(xiàn)的)。

準備測試數(shù)據(jù)

CREATETABLEt1(pkCHAR(5)PRIMARYKEY);
INSERTINTOt1VALUES('aaaaa'),('bbbbb'),('bbbcc'),('ccccc'),('ddddd'),('eeeee');

測試方法

S1 S2
這一步的目的是2行數(shù)據(jù)key buffer就滿
SET DEBUG='+d,ddl_buf_add_two';
set global innodb_purge_stop_now=ON;
DELETE FROM t1 WHERE pk = 'bbbcc';
進行DDL,并且來到ddl0par-scan.cc:238 行
ALTER TABLE t1 ENGINE=InnoDB, ALGORITHM=INPLACE
SET GLOBAL innodb_purge_run_now=ON;
DDL繼續(xù)進程(丟數(shù)據(jù))

測試結果

285831a8-c0df-11ef-9310-92fbcf53809c.jpg

寫在后面

在線上生產環(huán)境中,除了必要的增刪字段、增刪索引、修改字段定義外,直接執(zhí)行 ALTER TABLE ... ENGINE=InnoDB 或 OPTIMIZE TABLE 重建整個表空間的行為還是比較少的,尤其是操作大表時,也基本上都習慣了用類似 gt-osc 之類的第三方輔助工具來完成。

此外,調大 innodb_ddl_buffer_size 參數(shù)值也可以應對大部分業(yè)務表的DDL操作需求,在我的測試中,調大到10MB就可以保證上述測試表有幾十萬行數(shù)據(jù)時不出問題,調大到100MB則可以保證上述測試表有千萬行數(shù)據(jù)時不出問題。如果是更大、更寬的表就需要進一步測試驗證了。

總的來看,這個問題在線上生產環(huán)境中并不是百分百會觸發(fā),只是存在一定較低的幾率,在文章一開始也提到了幾個可以規(guī)避的方法,所以說其影響其實也是有限的,不必過于緊張。先采用緊急辦法規(guī)避問題,后面再擇機升級版本就好。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • MySQL
    +關注

    關注

    1

    文章

    928

    瀏覽量

    29739
  • DDL
    DDL
    +關注

    關注

    0

    文章

    14

    瀏覽量

    6568

原文標題:MySQL 8.0/8.4執(zhí)行DDL會丟數(shù)據(jù)?是,但影響有限

文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    MySQL數(shù)據(jù)庫慢查詢分析與優(yōu)化實戰(zhàn)

    在討論MySQL慢查詢之前,需要先明確一個關鍵前提:什么是慢查詢? 不同業(yè)務場景下,慢查詢的定義差異巨大。一個數(shù)據(jù)報表后臺的SQL執(zhí)行30秒可能屬于正常范圍,但一個訂單創(chuàng)建的數(shù)據(jù)庫操作
    的頭像 發(fā)表于 04-02 09:38 ?150次閱讀

    NineData 新增支持 MySQL 到 openGauss PostgreSQL 數(shù)據(jù)復制鏈路

    MySQL 到 openGauss PostgreSQL 兼容版的遷移,真正難的從來不是“把數(shù)據(jù)搬過去”,而是如何在業(yè)務不停、數(shù)據(jù)持續(xù)變化、結果需要驗證、問題需要及時發(fā)現(xiàn)的前提下,把整個遷移過程穩(wěn)穩(wěn)
    的頭像 發(fā)表于 03-19 11:44 ?191次閱讀
    NineData 新增支持 <b class='flag-5'>MySQL</b> 到 openGauss PostgreSQL <b class='flag-5'>數(shù)據(jù)</b>復制鏈路

    MySQL主從延遲排查全流程

    復制延遲一上來,很多人先盯 Seconds_Behind_Master。這個指標當然要看,但它只能告訴你“延遲已經發(fā)生了”,不能告訴你是網絡拉取慢、Relay Log 堆積、SQL 線程執(zhí)行慢、并行復制沒吃滿,還是下游被長事務、DDL、熱點表拖住了。
    的頭像 發(fā)表于 03-11 09:49 ?360次閱讀

    恒訊科技解析:如何安裝MySQL并創(chuàng)建數(shù)據(jù)

    安裝和管理MySQL不必復雜。只需幾分鐘,你就能在Linux服務器上搭建MySQL,創(chuàng)建第一個數(shù)據(jù)庫,甚至自動化備份——同時確保數(shù)據(jù)安全有序。 什么是
    的頭像 發(fā)表于 01-14 14:25 ?326次閱讀

    工業(yè)數(shù)據(jù)中臺支持接入MySQL數(shù)據(jù)庫嗎

    工業(yè)數(shù)據(jù)中臺完全支持接入MySQL數(shù)據(jù)庫 ,且通過數(shù)據(jù)同步、集成與治理等技術手段,能夠充分發(fā)揮MySQL
    的頭像 發(fā)表于 12-04 11:23 ?493次閱讀
    工業(yè)<b class='flag-5'>數(shù)據(jù)</b>中臺支持接入<b class='flag-5'>MySQL</b><b class='flag-5'>數(shù)據(jù)</b>庫嗎

    Mysql數(shù)據(jù)恢復—Windows Server下MySQL(InnoDB)全表誤刪數(shù)據(jù)恢復案例

    本地服務器,操作系統(tǒng)為windows server。服務器上部署mysql單實例,innodb引擎,獨立表空間。未進行數(shù)據(jù)庫備份,未開啟binlog。 人為誤操作使用Delete命令刪除數(shù)據(jù)時未添加where子句,導致全表
    的頭像 發(fā)表于 09-23 15:56 ?848次閱讀
    <b class='flag-5'>Mysql</b><b class='flag-5'>數(shù)據(jù)</b>恢復—Windows Server下<b class='flag-5'>MySQL</b>(InnoDB)全表誤刪<b class='flag-5'>數(shù)據(jù)</b>恢復案例

    mysql數(shù)據(jù)恢復—mysql數(shù)據(jù)庫表被truncate的數(shù)據(jù)恢復案例

    某云ECS網站服務器,linux操作系統(tǒng),部署了mysql數(shù)據(jù)庫。工作人員在執(zhí)行數(shù)據(jù)庫版本更新測試時,錯誤地將本應在測試庫執(zhí)行的sql腳本在生產庫上
    的頭像 發(fā)表于 09-11 09:28 ?1161次閱讀
    <b class='flag-5'>mysql</b><b class='flag-5'>數(shù)據(jù)</b>恢復—<b class='flag-5'>mysql</b><b class='flag-5'>數(shù)據(jù)</b>庫表被truncate的<b class='flag-5'>數(shù)據(jù)</b>恢復案例

    CentOS 7下MySQL 8雙主熱備高可用架構全解

    MySQL主節(jié)點2 核心邏輯: 通過Keepalived實現(xiàn)VIP漂移 雙向GTID同步保證數(shù)據(jù)一致性 雙寫模式需配合應用層沖突解決機制 MySQL 8部署流程 ? 步驟1:官方源配置 wget
    的頭像 發(fā)表于 08-12 17:08 ?973次閱讀

    0.1 至 8.0 GHz SP3T 開關 skyworksinc

    電子發(fā)燒友網為你提供()0.1 至 8.0 GHz SP3T 開關相關產品參數(shù)、數(shù)據(jù)手冊,更有0.1 至 8.0 GHz SP3T 開關的引腳圖、接線圖、封裝手冊、中文資料、英文資料,0.1 至
    發(fā)表于 08-07 18:31
    0.1 至 <b class='flag-5'>8.0</b> GHz SP3T 開關 skyworksinc

    MySQL 8.0性能優(yōu)化實戰(zhàn)指南

    作為一名運維工程師,MySQL數(shù)據(jù)庫優(yōu)化是我們日常工作中最具挑戰(zhàn)性的任務之一。MySQL 8.0作為當前主流版本,在性能、安全性和功能上都有了顯著提升,但如何充分發(fā)揮其潛力,仍需要我們
    的頭像 發(fā)表于 07-24 11:48 ?1025次閱讀

    MySQL數(shù)據(jù)備份與恢復策略

    數(shù)據(jù)是企業(yè)的核心資產,MySQL作為主流的關系型數(shù)據(jù)庫管理系統(tǒng),其數(shù)據(jù)的安全性和可靠性至關重要。本文將深入探討MySQL
    的頭像 發(fā)表于 07-14 11:11 ?866次閱讀

    企業(yè)級MySQL數(shù)據(jù)庫管理指南

    在當今數(shù)字化時代,MySQL作為全球最受歡迎的開源關系型數(shù)據(jù)庫,承載著企業(yè)核心業(yè)務數(shù)據(jù)的存儲與處理。作為數(shù)據(jù)庫管理員(DBA),掌握MySQL
    的頭像 發(fā)表于 07-09 09:50 ?864次閱讀

    MYSQL集群高可用和數(shù)據(jù)監(jiān)控平臺實現(xiàn)方案

    該項目共分為2個子項目,由MYSQL集群高可用和數(shù)據(jù)監(jiān)控平臺兩部分組成。
    的頭像 發(fā)表于 05-28 10:10 ?1442次閱讀
    <b class='flag-5'>MYSQL</b>集群高可用和<b class='flag-5'>數(shù)據(jù)</b>監(jiān)控平臺實現(xiàn)方案

    MySQL數(shù)據(jù)庫采集網關是什么?有什么功能?

    MySQL數(shù)據(jù)庫采集網關是一種用于連接、采集、處理并傳輸數(shù)據(jù)MySQL數(shù)據(jù)庫的中間設備或軟件系統(tǒng),通常部署在
    的頭像 發(fā)表于 05-26 15:20 ?797次閱讀

    MySQL數(shù)據(jù)庫是什么

    MySQL數(shù)據(jù)庫是一種 開源的關系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS) ,由瑞典MySQL AB公司開發(fā),后被Oracle公司收購。它通過結構化查詢語言(SQL)進行
    的頭像 發(fā)表于 05-23 09:18 ?1420次閱讀