站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

MySQL的rollback(總結分享)

本篇文章給大家?guī)砹岁P于mysql的相關知識,其中主要整理了rollback的相關問題,主要介紹了書屋回滾以及回滾機制等內容,下面一起來看一下,希望對大家有幫助。

MySQL的rollback(總結分享)

推薦學習:mysql視頻教程

經(jīng)常會遇到操作一張大表,發(fā)現(xiàn)操作時間過長或影響在線業(yè)務,想要回退大表操作的場景。在停止大表操作之后,等待回滾是一個很漫長的過程,盡管可能對知道一些縮短時間的方法,處于對生產(chǎn)環(huán)境數(shù)據(jù)完整性的敬畏,也會選擇不做介入。

事務回滾

事務是關系型數(shù)據(jù)庫里的執(zhí)行單位,可以通過最后階段控制選擇提交或回滾。在各種無法保證完整性的場景下進行回滾操作。MySQL里回滾是通過Undo日志完成,Undo日志記錄包含關于如何撤消事務相關的最新更改的信息。Undo日志存在于Undo日志段中,Undo日志段包含在回滾段中。回滾段位于undo表空間和全局Temporary表空間中。
關系如下:

MySQL的rollback(總結分享)

  • undo文件

    MySQL的rollback(總結分享)

mysql > show variables like '%undo%'; +--------------------------+--------------------+ | Variable_name            | Value              | +--------------------------+--------------------+ | innodb_max_undo_log_size | 1073741824         | | innodb_undo_directory    | /opt/data8.0/mysql | | innodb_undo_log_encrypt  | OFF                | | innodb_undo_log_truncate | ON                 | | innodb_undo_tablespaces  | 2                  | +--------------------------+--------------------+ 5 rows in set (0.00 sec)

全局Temporary所指的一個臨時表空間(ibtmp1),用于存儲對用戶創(chuàng)建的臨時表所做更改的回滾段。

MySQL的rollback(總結分享)

mysql > SELECT @@innodb_temp_data_file_path; +-------------------------------+ | @@innodb_temp_data_file_path  | +-------------------------------+ | ibtmp1:128M:autoextend:max:30G | +-------------------------------+

理解了回滾包含的文件都有那些 ,繼續(xù)往下看。

回滾機制:

MySQL回滾控制是內部innodb引擎協(xié)調解決,不提供人為控制的機制。目前提供的MySQL回滾參數(shù)如下:

mysql> SHOW VARIABLES LIKE  '%ROLL%'; +----------------------------+-------+ | Variable_name              | Value | +----------------------------+-------+ | innodb_rollback_on_timeout | OFF   | | innodb_rollback_segments   | 128   | +----------------------------+-------+

innodb_rollback_on_timeout:

InnoDB默認只在事務超時時回滾最后一條語句。如果指定了——InnoDB -rollback-on-timeout,事務超時將導致InnoDB中止并回滾整個事務。默認下是關閉的,一旦指定時間,如回滾失敗。可以想象到數(shù)據(jù)會存在不一致的問題。這個方式不可取。

Innodb_rollback_segments(1~128):

定義了分配給每個undo表空間的回滾段的數(shù)量,以及為生成undo記錄的事務分配的全局臨時表空間的數(shù)量。
回滾段支持的事務數(shù)量:取決于回滾段中的撤銷slot數(shù)量以及每個事務所需的撤銷日志數(shù)量

官方提供的回滾段中undo槽的數(shù)量根據(jù)InnoDB頁面大小有關:

MySQL的rollback(總結分享)

從最新的MySQL8.0.27源碼實現(xiàn)中 storageinnobaseincludetrx0rseg.h:

/* Number of undo log slots in a rollback segment file copy  這里 UNIV_PAGE_SIZE正常頁面的大小  即 1024*/ #define TRX_RSEG_N_SLOTS (UNIV_PAGE_SIZE / 16)  /* Maximum number of transactions supported by a single rollback segment  單個回滾段支持的最大事務數(shù)1024/2=512 */ #define TRX_RSEG_MAX_N_TRXS (TRX_RSEG_N_SLOTS / 2)

在默認情況下page中又劃分了1024個slot槽(TRX_RSEG_N_SLOTS),每個slot又對應到一個undo log對象,因此理論上InnoDB可以支持 128 * 512=65536個普通事務。
原理部分參考MySQL · 引擎特性 · InnoDB undo log 漫游
官方提供undbo回滾并發(fā)讀寫場景:

MySQL的rollback(總結分享)

從上訴的原理中回到實際應用場景中:
對于回滾段支持的能力,還是可觀的,但往往執(zhí)行大批量的回滾的時候非常慢。特別是在線處理過程中發(fā)現(xiàn)10w行回滾 有可能10分鐘這樣的情況。甚至更長時間。
下面通過sysbench準備5000w的單表數(shù)據(jù),在無負載下,大概刪除1分鐘,之后通過kill -9,強制停止方式回滾事務:

MySQL的rollback(總結分享)

明顯重新啟動效果更加。
但kill -9 方式容易把數(shù)據(jù)頁損壞,存在很大的風險。日常當中數(shù)據(jù)庫也有負載,可想而知,大事務回滾的代價非常大。

總結

應盡量避免大的回退操作,非常消耗數(shù)據(jù)庫資源和性能,生產(chǎn)環(huán)境下會導致重大生產(chǎn)事故。避免不了大事務回滾,可以采取以下方式:

  • 對于批量操作,可以分批提交 比如1000行 ~5000行之類的
  • undo空間和全局臨時表空間 可以適當?shù)恼{整。建議4個undo文件,全局ibtmp1初始化1G
  • 高可用環(huán)境下,能確數(shù)據(jù)的一致性下,可以把從提升新主,提供服務,等待大事務回滾。
  • 極端情況下,可以通過 kill -9 重啟操作會因為數(shù)據(jù)量非常大,導致mysql恢復緩慢,此時需要等待mysql進行崩潰恢復,根據(jù)數(shù)據(jù)量的不同,等待的時間也不同
  • 如重新啟動過程中,存在數(shù)據(jù)頁損壞或跳過回滾 ,可通過innodb_force_recovery=3(不執(zhí)行事務回滾操作。)

推薦學習:mysql視頻教程

贊(0)
分享到: 更多 (0)
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
国产色婷婷五月精品综合在线 | 一本大道无码日韩精品影视| 18精品久久久无码午夜福利| 97在线精品视频| 亚洲国产精品日韩| 国产乱码精品一区三上| 亚洲国产日韩综合久久精品| 国产福利专区精品视频| 精品国产网红福利在线观看| 亚洲精品一级无码鲁丝片| 亚洲精品无码日韩国产不卡?V| 国产精品天天看大片特色视频| 久久精品国产精品亚洲毛片| 国产精品人人爽人人做我的可爱 | 日韩人妻系列无码专区| 无码A级毛片日韩精品| 国产精品视频一区二区猎奇| 1313午夜精品理伦片| 久久精品国1国二国三| 亚洲国产精品无码久久SM| 四虎国产精品免费永久在线| 国产精品免费久久| 一区二区三区久久精品| 精品日韩亚洲AV无码 | 亚洲毛片av日韩av无码| 最新国产精品好看的国产精品| 最新国产精品亚洲| 国产精品视频第一页| 国产精品免费无遮挡无码永久视频| 精品国产免费一区二区三区| 国产A√精品区二区三区四区| 亚洲欧美日韩一区二区三区在线| 国产精品第100页| 国产精品乱码在线观看| 亚洲精品国产成人影院| 国产精品久久久久久福利69堂| 99久久99久久免费精品小说| 国产精品久久久久999| 国产一区二区精品久久岳| 国产精品99在线播放| 国产精品VIDEOSSEX久久发布 |