91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL的rollback實例分析

發布時間:2022-06-24 13:37:41 來源:億速云 閱讀:341 作者:iii 欄目:MySQL數據庫

本篇內容介紹了“MySQL的rollback實例分析”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

MySQL的rollback實例分析

事務回滾

事務是關系型數據庫里的執行單位,可以通過最后階段控制選擇提交或回滾。在各種無法保證完整性的場景下進行回滾操作。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),用于存儲對用戶創建的臨時表所做更改的回滾段。

MySQL的rollback實例分析

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

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

回滾機制:

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

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中止并回滾整個事務。默認下是關閉的,一旦指定時間,如回滾失敗。可以想象到數據會存在不一致的問題。這個方式不可取。

Innodb_rollback_segments(1~128):

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

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

MySQL的rollback實例分析

從最新的MySQL8.0.27源碼實現中 storage\innobase\include\trx0rseg.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 
單個回滾段支持的最大事務數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個普通事務。
官方提供undbo回滾并發讀寫場景:

MySQL的rollback實例分析

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

MySQL的rollback實例分析

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

“MySQL的rollback實例分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

县级市| 辽阳市| 邯郸县| 九江市| 高雄市| 灵石县| 江达县| 林甸县| 华阴市| 兴国县| 南投市| 兖州市| 伊宁市| 龙山县| 屏东市| 德格县| 贺兰县| 万山特区| 临泉县| 略阳县| 柯坪县| 黄骅市| 岱山县| 株洲县| 罗山县| 武义县| 太仆寺旗| 延吉市| 梨树县| 隆尧县| 贡嘎县| 那曲县| 松滋市| 赤峰市| 竹山县| 城市| 连州市| 朝阳市| 毕节市| 安图县| 饶平县|