GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者: 王權富貴 文章來源:GreatSQL社區投稿 背景概述 由於安裝資料庫時將MySQL的數據目錄放在了根目錄下,現在存儲空間不足,想通過mv將數據 ...
- GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。
- GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。
- 作者: 王權富貴
- 文章來源:GreatSQL社區投稿
背景概述
由於安裝資料庫時將MySQL的數據目錄放在了根目錄下,現在存儲空間不足,想通過mv將數據目錄移動到其他目錄下,但將數據目錄移動到其他數據目錄後,啟動資料庫失敗。
問題復現
本次測試基於 MySQL 8.0.31
1.關閉資料庫
mysql> shutdown;
Query OK, 0 rows affected (0.02 sec)
2.查看當前數據目錄所在位置
shell> pwd
/mysql80
3.通過mv移動整個MySQL數據目錄到其他目錄
shell> mv /mysql80 /data
shell> cd /data/mysql80/svr
shell> ln -s mysql-8.0.31-linux-glibc2.12-x86_64 mysql
4.修改屬主屬組
shell> chown -R mysql.mysql /data
5.修改配置文件中數據目錄的地址
shell> sed -i 's#/mysql80#/data/mysql80#g' my5001.cnf
6.啟動資料庫
shell> /data/mysql80/svr/mysql/bin/mysqld_safe \
--defaults-file=/data/mysql80/conf/my5001.cnf --user=mysql &
此時啟動資料庫失敗,錯誤日誌報錯如下:
mysqld: File '/mysql80/dbdata/data5001/log/binlog.000012' not found (OS errno 2 - No such file or directory)
2023-02-27T10:38:09.240576+08:00 0 [ERROR] [MY-010958] [Server] Could not open log file.
2023-02-27T10:38:09.240657+08:00 0 [ERROR] [MY-010041] [Server] Can't init tc log
2023-02-27T10:38:09.240718+08:00 0 [ERROR] [MY-010119] [Server] Aborting
2023-02-27T10:38:10.548605+08:00 0 [System] [MY-010910] [Server] /data/mysql80/svr/mysql/bin/mysqld: Shutdown complete (mysqld 8.0.31) MySQL Community Server - GPL.
這裡報錯顯示找不到binlog
文件,並且報錯顯示的binlog
的目錄還是之前的,但是配置文件中的目錄已經修改
shell> grep 'log-bin' my5001.cnf
log-bin=/data/mysql80/dbdata/data5001/log/binlog
log-bin-trust-function-creators
7.問題解決
最後通過查找發現 binlog.index
文件中存放著每個binlog
文件的絕對路徑地址,這裡的路徑還是之前路徑,內容如下:
shell> cat binlog.index
/mysql80/dbdata/data5001/log/binlog.000001
/mysql80/dbdata/data5001/log/binlog.000002
/mysql80/dbdata/data5001/log/binlog.000003
/mysql80/dbdata/data5001/log/binlog.000004
/mysql80/dbdata/data5001/log/binlog.000005
/mysql80/dbdata/data5001/log/binlog.000006
/mysql80/dbdata/data5001/log/binlog.000007
/mysql80/dbdata/data5001/log/binlog.000008
/mysql80/dbdata/data5001/log/binlog.000009
/mysql80/dbdata/data5001/log/binlog.000010
/mysql80/dbdata/data5001/log/binlog.000011
/mysql80/dbdata/data5001/log/binlog.000012
修改binlog.index
文件中binlog
的絕對路徑:
shell> sed -i 's#/mysql80#/data/mysql80#g' binlog.index
shell> cat binlog.index
/data/mysql80/dbdata/data5001/log/binlog.000001
/data/mysql80/dbdata/data5001/log/binlog.000002
/data/mysql80/dbdata/data5001/log/binlog.000003
/data/mysql80/dbdata/data5001/log/binlog.000004
/data/mysql80/dbdata/data5001/log/binlog.000005
/data/mysql80/dbdata/data5001/log/binlog.000006
/data/mysql80/dbdata/data5001/log/binlog.000007
/data/mysql80/dbdata/data5001/log/binlog.000008
/data/mysql80/dbdata/data5001/log/binlog.000009
/data/mysql80/dbdata/data5001/log/binlog.000010
/data/mysql80/dbdata/data5001/log/binlog.000011
/data/mysql80/dbdata/data5001/log/binlog.000012
8.啟動資料庫
shell> /data/mysql80/svr/mysql/bin/mysqld_safe
--defaults-file=/data/mysql80/conf/my5001.cnf --user=mysql &
資料庫啟動成功。
9.作為從節點
需要註意的是,如果該實例還作為其他實例的從節點,還需要設置 relaylog.index 文件中relay log的絕對路徑,否則會報如下錯誤: 錯誤日誌報錯:
2023-02-27T15:56:55.224372+08:00 0 [ERROR] [MY-010599] [Repl] log /mysql80/dbdata/data5002/log/relaylog.000002 listed in the index, but failed to stat.
2023-02-27T15:56:55.224422+08:00 0 [ERROR] [MY-011059] [Repl] Error counting relay log space.
2023-02-27T15:56:55.226571+08:00 0 [ERROR] [MY-010426] [Repl] Slave: Failed to initialize the master info structure for channel ''; its record may still be present in 'mysql.slave_master_info' table, consider deleting it.
2023-02-27T15:56:55.226622+08:00 0 [ERROR] [MY-010529] [Repl] Failed to create or recover replication info repositories.
執行 start replica 時也會報錯:
# 客戶端報錯
mysql> start replica;
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
# error log報錯
2023-02-27T15:57:53.858798+08:00 8 [ERROR] [MY-013124] [Repl] Slave SQL for channel '': Slave failed to initialize relay log info structure from the repository, Error_code: MY-013124
10.問題解決
修改 relaylog.index
文件中relay log的絕對路徑
sed -i 's#/mysql80#/data/mysql80#g' relaylog.index
重新啟動資料庫,並啟動主從複製
# 重啟實例
mysql> restart;
# 啟動主從複製
mysql> start replica;
此時主從複製恢復正常。
總結
- 搭建資料庫前應提前規劃並確定存儲位置及磁碟大小,以及之後數據量增長情況,避免磁碟空間不足時導致資料庫不能正常使用。
- 當我們手動進行數據目錄的移動時,不僅需要修改配置文件中數據目錄的路徑,還需要修改
binlog.index
relaylog.index
文件中binlog
及relaylog
的絕地路徑,否則啟動時可能出報錯,並且不能正常建立主從關係。
Enjoy GreatSQL