最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql?optimize?table?時(shí)報(bào)錯(cuò):Temporary?file?write?fail的解決

 更新時(shí)間:2022年09月27日 09:05:54   作者:大雪冬至  
這篇文章主要介紹了Mysql?optimize?table?時(shí)報(bào)錯(cuò):Temporary?file?write?fail的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1. 問(wèn)題描述

當(dāng)我們執(zhí)行 optimize table xxx ; 嘗試進(jìn)行碎片整理時(shí),也可能報(bào)錯(cuò) Temporary file write failure.

Tips: MySQL 8.x

# 執(zhí)行 optimize  命令時(shí)會(huì)發(fā)現(xiàn)報(bào)錯(cuò)
mysql>  optimize local table t_word;
+-------------------------+----------+----------+-------------------------------------------------------------------+
| Table                   | Op       | Msg_type | Msg_text                                                          |
+-------------------------+----------+----------+-------------------------------------------------------------------+
| abc.t_word | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| abc.t_word | optimize | error    | Temporary file write failure.                                     |
| abc.t_word | optimize | status   | Operation failed                                                  |
+-------------------------+----------+----------+-------------------------------------------------------------------+
3 rows in set, 1 warning (54 min 27.89 sec)


查看mysql日志文件,也會(huì)發(fā)現(xiàn)報(bào)錯(cuò) [InnoDB] Error number 28 means ‘No space left on device’

[ERROR] [MY-012639] [InnoDB] Write to file (merge) failed at offset 5405409280, 1048576 bytes should have been written, only 114688 were written. Operating system error number 28. Check that your OS and file system support files of this size. Check also that the disk is not full or a disk quota exceeded.
2022-05-10T14:00:58.817066+08:00 2272191 [ERROR] [MY-012640] [InnoDB] Error number 28 means 'No space left on device'

但是實(shí)際上我的 MySQL 的數(shù)據(jù)盤(pán)空間是足夠保存這個(gè)表的兩倍空間的,那么則說(shuō)明這個(gè)報(bào)錯(cuò)(No space left on device)說(shuō)的是系統(tǒng)盤(pán)的空間。

Tips: 由于在 MySQL 5.6.7 之后推出了 Online DDL ,所以我執(zhí)行的 optimize local table t_word; 將會(huì)以 Online DDL 的方式執(zhí)行

為了進(jìn)一步驗(yàn)證此問(wèn)題,查閱一下官方文檔

官方文檔可知 Online DDL 會(huì)需要?jiǎng)?chuàng)建 臨時(shí)日志文件, 臨時(shí)排序文件,中間表文件,其中的 臨時(shí)排序文件(Temporary sort files)會(huì)就寫(xiě)入 mysql的臨時(shí)目錄(tmpdir)。

查看下MySQL的 tmpdir 的位置

# 進(jìn)入MySQL
mysql> SHOW VARIABLES LIKE 'tmpdir';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| tmpdir        | /tmp  |
+---------------+-------+
1 row in set (0.00 sec)

# 回到Linux ,可見(jiàn) /tmp 目錄實(shí)際上是在系統(tǒng)盤(pán)(vda1)上的。(這個(gè)是默認(rèn)位置)
> df -h /tmp
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        20G  6.0G   13G  33% /

這里簡(jiǎn)單這幾個(gè)文件做個(gè)小結(jié)

  • 臨時(shí)日志文件則由 innodb_sort_buffer_size 變量控制, 在(data-dir)中創(chuàng)建。
  • 臨時(shí)排序文件 則在 (tmp-dir) 中創(chuàng)建。
  • 臨時(shí)中間表文件則在(data-dir)中創(chuàng)建。

2. 解決方案

由上可知,解決方案只剩下這幾種:

1. 方案一: 擴(kuò)容系統(tǒng)盤(pán),擴(kuò)容系統(tǒng)盤(pán)后就會(huì)有足夠的空間存儲(chǔ) Online DDL 所需的 臨時(shí)排序文件。 (不建議)

* 雖然Linux支持在線(xiàn)擴(kuò)容,但是依然存在風(fēng)險(xiǎn),所以不建議。

2. 方案二: 設(shè)置 tmpdir 的目錄位置到其他硬盤(pán) (不建議)

網(wǎng)上普遍推薦這種,但是需要重啟MySQL才能生效,代價(jià)太大,所以也不建議。

這里也備注一下修改方式 (若能接受重啟MySQL,那么可以這樣做)

#1.查看 tmpdir
mysql> SHOW VARIABLES LIKE 'tmpdir';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| tmpdir        | /tmp  |
+---------------+-------+
1 row in set (0.00 sec)

#2.創(chuàng)建 tmpdir目錄

mkdir -p /data/tmpdir
chown -R mysql:mysql /data/tmpdir
chmod a+w /data/tmpdir

#3. 修改MySQL配置,設(shè)置 tmpdir 
vim /etc/my.cnf
把tmpdir設(shè)置到 /data/tmpdir
tmpdir=/data/tmpdir

# 4. 修改完成后,重啟mysql服務(wù)
service mysqld restart

Tips: 官方建議可以給 tmpdir 變量配置多個(gè)目錄分?jǐn)傌?fù)載 。

3. 方案三: 為 online ddl 單獨(dú)設(shè)置 innodb_tmpdir , 此變量允許動(dòng)態(tài)設(shè)置,無(wú)需重啟mysql即可生效?!就扑]】

  • innodb_tmpdir : 此選項(xiàng)在 MySQL 5.7.11 中引入,以幫助避免由于大型臨時(shí)排序文件而可能發(fā)生的臨時(shí)目錄溢出

設(shè)置方式:

	#注意: 執(zhí)行前必須確保 /mnt/mysql-innodb-temp 目錄已經(jīng)創(chuàng)建了,并且給這個(gè)目錄設(shè)置權(quán)限,確保MySQL能夠讀寫(xiě)改目錄
 	mysql> set global innodb_tmpdir= '/mnt/mysql-innodb-temp'
 	```
	
下面是操作(踩坑)示例: 
	
```sh
# 注意: 必須先在系統(tǒng)上創(chuàng)建臨時(shí)文件目錄,并且確保mysql用戶(hù)有權(quán)限訪(fǎng)問(wèn)這個(gè)目錄
mysql> show VARIABLES like 'innodb_tmpdir';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| innodb_tmpdir |       |
+---------------+-------+
1 row in set (0.09 sec)

# 1. 設(shè)置   innodb_tmpdir
mysql> set global innodb_tmpdir= '/mnt/mysql-innodb-temp';
#  或者執(zhí)行
mysql> set @@global.innodb_tmpdir=/mnt/mysql-innodb-temp

# 如果報(bào)錯(cuò) ERROR 1231 (42000): Variable 'innodb_tmpdir' can't be set to the value of '/mnt/mysql-innodb-temp' 則說(shuō)明這個(gè)目錄跟 data-dir 重復(fù)了,如果沒(méi)重復(fù)則執(zhí)行這個(gè)已經(jīng)查看詳情
# 顯示最近一次警告信息
# 語(yǔ)法: SHOW WARNINGS [LIMIT [offset,] row_count]
mysql> SHOW WARNINGS;
+---------+------+-------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                   |
+---------+------+-------------------------------------------------------------------------------------------+
| Warning | 1210 | InnoDB: Path doesn't exist.                                                               |
| Error   | 1231 | Variable 'innodb_tmpdir' can't be set to the value of '/mnt/mysql-innodb-temp' |
+---------+------+-------------------------------------------------------------------------------------------+

# Path doesn't exist. 說(shuō)明該目錄不存在, 創(chuàng)建目錄后再執(zhí)行命令,如果發(fā)現(xiàn)依然報(bào)錯(cuò),那么也可能是因?yàn)闆](méi)有文件權(quán)限
mysql>  SHOW WARNINGS limit 10;
+---------+------+---------------------------------------------------------------------------------+
| Level   | Code | Message                                                                         |
+---------+------+---------------------------------------------------------------------------------+
| Warning | 1210 | InnoDB: Server doesn't have permission in the given location.                   |
| Error   | 1231 | Variable 'innodb_tmpdir' can't be set to the value of '/mnt/mysql-innodb-temp' |
+---------+------+---------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

# 那么設(shè)置該目錄的文件權(quán)限即可。 
> chmod 777 /mnt/mysql-innodb-temp

# 再回到 mysql 發(fā)現(xiàn)執(zhí)行成功了!
mysql> set @@global.innodb_tmpdir='/mnt/mysql-innodb-temp';
Query OK, 0 rows affected (0.00 sec)

# 檢查下效果
mysql>  show VARIABLES like 'innodb_tmpdir';
+---------------+-----------------------------------+
| Variable_name | Value                             |
+---------------+-----------------------------------+
| innodb_tmpdir |/mnt/mysql-innodb-temp |
+---------------+-----------------------------------+
1 row in set (0.01 sec)

小結(jié)一下 :

innodb_tmpdir , 此變量允許動(dòng)態(tài)設(shè)置,無(wú)需重啟mysql即可生效。

  • 有效值是 MySQL 數(shù)據(jù)目錄路徑(data-dir)以外的任何目錄路徑。
  • 設(shè)置innodb_tmpdir要求用戶(hù)有file權(quán)限
  • 引入該innodb_tmpdir選項(xiàng)是為了幫助避免溢出位于tmpfs文件系統(tǒng)上的臨時(shí)文件目錄。ALTER TABLE由于在重建表的 聯(lián)機(jī)操作期間創(chuàng)建的大型臨時(shí)排序文件可能會(huì)發(fā)生此類(lèi)溢出。
  • 主從復(fù)制模式中,建議 innodb_tmpdir在每臺(tái)服務(wù)器上單獨(dú)配置。

3. 解決了上面的問(wèn)題后,再執(zhí)行DDL, 就會(huì)發(fā)現(xiàn)能執(zhí)行成功了

mysql> optimize local table t_word;
-------------------------+----------+----------+-------------------------------------------------------------------+
| Table                   | Op       | Msg_type | Msg_text                                                          |
+-------------------------+----------+----------+-------------------------------------------------------------------+
| abc.t_word| optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| abc.t_word| optimize | status   | OK                                                                |
+-------------------------+----------+----------+-------------------------------------------------------------------+
2 rows in set (2 hours 29 min 54.20 sec)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳細(xì)解讀分布式鎖原理及三種實(shí)現(xiàn)方式

    詳細(xì)解讀分布式鎖原理及三種實(shí)現(xiàn)方式

    這篇文章從三種基于不同形式的分布式鎖的實(shí)現(xiàn),數(shù)據(jù)庫(kù)、緩存和zookeeper,內(nèi)容比較詳細(xì),具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • 不使用MySQL數(shù)據(jù)庫(kù)的五個(gè)給力理由解析

    不使用MySQL數(shù)據(jù)庫(kù)的五個(gè)給力理由解析

    眾所周知,MySQL數(shù)據(jù)庫(kù)雖然功能未必很強(qiáng)大,但因?yàn)樗拈_(kāi)源、廣泛傳播,導(dǎo)致很多人都了解到這個(gè)數(shù)據(jù)庫(kù)。
    2011-03-03
  • mysql 5.7.16 zip包安裝配置方法圖文教程

    mysql 5.7.16 zip包安裝配置方法圖文教程

    這篇文章主要為大家分享了mysql 5.7.16 zip包安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • mysql下centos安裝mariadb的方法及遇到的問(wèn)題

    mysql下centos安裝mariadb的方法及遇到的問(wèn)題

    這篇文章主要介紹了mysql下centos安裝mariadb的方法及遇到的問(wèn)題,在安裝之前要?jiǎng)h除之前安裝的mariadb,具體安裝方法及遇到問(wèn)題解決方法,大家參考下本文
    2018-05-05
  • 一鍵重置mysql的root密碼腳本

    一鍵重置mysql的root密碼腳本

    本節(jié)主要介紹了一鍵重置mysql的root密碼的實(shí)現(xiàn)腳本,需要的朋友可以參考下
    2014-07-07
  • MYSQL大表加索引的實(shí)現(xiàn)

    MYSQL大表加索引的實(shí)現(xiàn)

    本文主要介紹了MYSQL大表加索引的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 在C#和MySQL中存取中文字符時(shí)避免亂碼的方法

    在C#和MySQL中存取中文字符時(shí)避免亂碼的方法

    這篇文章主要介紹了在C#和MySQL中存取中文字符時(shí)避免亂碼的方法,主要還是老辦法先轉(zhuǎn)換成Unicode編碼,需要的朋友可以參考下
    2015-05-05
  • MySQL生僻字插入失敗的處理方法(Incorrect string value)

    MySQL生僻字插入失敗的處理方法(Incorrect string value)

    最近,業(yè)務(wù)方反饋有個(gè)別用戶(hù)信息插入失敗,報(bào)錯(cuò)提示類(lèi)似Incorrect string value:"\xF0\xA5 .....看這個(gè)提示應(yīng)該是字符集不支持某個(gè)生僻字造成的,需要的朋友可以參考下
    2017-05-05
  • 怎樣設(shè)置才能允許外網(wǎng)訪(fǎng)問(wèn)MySQL

    怎樣設(shè)置才能允許外網(wǎng)訪(fǎng)問(wèn)MySQL

    大多數(shù)情況下,mysql數(shù)據(jù)庫(kù)只要本機(jī)訪(fǎng)問(wèn)就可以了,這樣的話(huà),默認(rèn)安裝就OK,但是如果需要外網(wǎng)訪(fǎng)問(wèn)mysql數(shù)據(jù)庫(kù)的話(huà),應(yīng)該如何操作呢,想知道的話(huà),就好好看看下面的介紹吧
    2014-08-08
  • mysql中的存儲(chǔ)過(guò)程傳參問(wèn)題

    mysql中的存儲(chǔ)過(guò)程傳參問(wèn)題

    這篇文章主要介紹了mysql中的存儲(chǔ)過(guò)程傳參問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10

最新評(píng)論

佛山市| 依兰县| 古丈县| 靖州| 汉寿县| 塘沽区| 阳朔县| 凉山| 安顺市| 嵩明县| 道孚县| 上林县| 东山县| 甘孜| 遂溪县| 襄樊市| 西安市| 永安市| 赞皇县| 邢台市| 吉木萨尔县| 绥阳县| 兴隆县| 天门市| 洞口县| 肥乡县| 泸定县| 延川县| 土默特左旗| 英德市| 颍上县| 桂林市| 云龙县| 贵南县| 广汉市| 桂阳县| 屏东县| 江口县| 治多县| 土默特左旗| 崇仁县|