溫馨提示×

溫馨提示×

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

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

如何理解MySQL中的截斷

發布時間:2021-11-16 14:26:04 來源:億速云 閱讀:863 作者:柒染 欄目:MySQL數據庫

這期內容當中小編將會給大家帶來有關如何理解MySQL中的截斷,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

MySQL中的undo截斷還是一個很不錯的特性。這讓我想起了很久以前看到一個諾大的ibdata,但是卻拿它無能為力,想把它收縮唯一的辦法就是重建或者重構數據。

   Oracle用得久了,總會有一些想法,看起來很平常的技術怎么在MySQL中卻無能為力。當然這個念頭也有些日子了。

   MySQL 5.6中把undo做了剝離,可以指定單獨的undo表空間,但是要收縮階段還是無能為力,這個也算是一個過渡的特性吧,到了MySQL 5.7中,這個功能就可以說是上了正道了,我們可以截斷,化被動為主動,這種方式就很好。

    而如果要展望這個特性,我覺得還可以持續改進,就是可以在線修改,切換undo等。

    要實現這個階段功能,其實還需要花點功夫,那就是在初始化的時候就完成這些基礎配置,否則會收到下面這樣有些模糊的提示信息。

2017-02-28 22:39:48 7fedca8127e0 InnoDB: Expected to open 1 undo tablespaces but was able
2017-02-28 22:39:48 7fedca8127e0 InnoDB: to find only 0 undo tablespaces.
2017-02-28 22:39:48 7fedca8127e0 InnoDB: Set the innodb_undo_tablespaces parameter to the
2017-02-28 22:39:48 7fedca8127e0 InnoDB: correct value and retry. Suggested value is 0所以我們打算初始化一個全新的庫來做一個簡單的測試。

my.cnf的內容如下,你可以自己根據需要指定也可以。

my.cnf
[client]
socket = /home/mysql/mysql.sock

[mysql]
socket = /home/mysql/mysql.sock
default-character-set = utf8

[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /home/mysql
port = 3306
socket = /home/mysql/mysql.sock
pid-file = /home/mysql/mysql.pid
max_allowed_packet = 32M
ft_min_word_len = 4
event_scheduler = 1
explicit_defaults_for_timestamp=true
tmpdir = /dev/shm
character-set-server = utf8

#innodb_undo_directory=/data/undolog
innodb_undo_tablespaces=4
innodb_undo_logs=128
innodb_max_undo_log_size=200M
innodb_purge_rseg_truncate_frequency
innodb_undo_log_truncate=1
重點就是最后的幾個參數了。

先初始化一下數據字典,

mysqld  --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/home/mysql然后配置使得MySQL服務啟動

service mysql start打開文件目錄,就會赫然看到下面的幾個undo文件,因為參數

innodb_undo_tablespaces為4,所以會有4個文件。innodb_undo_logs默認是128個,至少是35個,官網也有詳細的解釋。而innodb_undo_directory的目錄則默認按照數據目錄來取得,所以我索性去掉了。4個Undo文件都是10M,也就是初始大小。

drwxr-x--- 2 mysql mysql     8192 Feb 28 23:09 performance_schema
drwxr-x--- 2 mysql mysql     8192 Feb 28 23:09 sys
-rw-r----- 1 mysql mysql 10485760 Feb 28 23:09 undo001
-rw-r----- 1 mysql mysql 10485760 Feb 28 23:09 undo002
-rw-r----- 1 mysql mysql 10485760 Feb 28 23:09 undo003
-rw-r----- 1 mysql mysql 10485760 Feb 28 23:09 undo004我們初始化數據,然后插入一些數據。

mysql> create table test_undo(id int,name varchar(30));
mysql> insert into test_undo values(1,'a');
mysql> insert into test_undo values(2,'b');
insert可以反復執行,數據就是指數級的增長,事務也會逐漸變大,大概在200萬數據量的時候,undo的分布如下:

-rw-r----- 1 mysql mysql 13631488 Feb 28 23:16 undo001
-rw-r----- 1 mysql mysql 22020096 Feb 28 23:16 undo002
-rw-r----- 1 mysql mysql 10485760 Feb 28 23:16 undo003
-rw-r----- 1 mysql mysql 10485760 Feb 28 23:16 undo004數據在1600萬左右的時候,undo文件的大小如下:

-rw-r----- 1 mysql mysql  13631488 Feb 28 23:20 undo001
-rw-r----- 1 mysql mysql  22020096 Feb 28 23:20 undo002
-rw-r----- 1 mysql mysql 150994944 Feb 28 23:20 undo003
-rw-r----- 1 mysql mysql  75497472 Feb 28 23:20 undo004這個時候我們開始測試一下截斷的部分,和一個參數密切相關,那就是innodb_purge_rseg_truncate_frequency,我們可以為了測試,適當設置小一些,能夠馬上看到效果,比如我設置為20

mysql> set global innodb_purge_rseg_truncate_frequency=20;然后我繼續開啟一個很大的事務,插入千萬數據,undo的文件就會暴增,當然因為最大的事務占用了一個undo文件,那個文件還是會持續增大,盡管超過了設定的閾值。

-rw-r----- 1 mysql mysql  13631488 Feb 28 23:33 undo001
-rw-r----- 1 mysql mysql  22020096 Feb 28 23:33 undo002
-rw-r----- 1 mysql mysql 150994944 Feb 28 23:33 undo003
-rw-r----- 1 mysql mysql 293601280 Feb 28 23:33 undo004然后我們使點小技巧,delete幾條數據,觸發截斷的臨界點。

mysql> delete from test_undo limit 10;再次查看,undo的文件就會收縮,當然你可以清晰的看到,不是所有的,因為和事務大小也有關系。

-rw-r----- 1 mysql mysql  13631488 Feb 28 23:34 undo001
-rw-r----- 1 mysql mysql  22020096 Feb 28 23:34 undo002
-rw-r----- 1 mysql mysql 150994944 Feb 28 23:34 undo003
-rw-r----- 1 mysql mysql  10485760 Feb 28 23:34 undo004

上述就是小編為大家分享的如何理解MySQL中的截斷了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女