Featured image of post 使用 PV 監控 MySQL / MariaDB 導入的進度

使用 PV 監控 MySQL / MariaDB 導入的進度

當導入大量數據時,我們通常會直接使用 mysql 或 mariadb 指令來導入數據,但是這樣的方式並不能很好的監控數據導入的進度,這時候我們可以使用 pv 來監控數據導入的比例。

最後更新
約 988 字

前言

當我們需要導入大量數據到 MySQL 或 MariaDB 數據庫時,通常會直接使用 mysqlmariadb 指令來執行 SQL 文件。然而,這種方式無法提供導入進度的可視化反饋,特別是在處理大型備份文件時,我們往往不知道還需要等待多長時間。

pv(Pipe Viewer)是一個強大的命令行工具,可以讓我們監控通過管道傳輸的數據進度,包括傳輸速度、已傳輸的數據量、剩餘時間等有用信息。

什麼是 PV?

pv 是一個用於監控通過管道傳輸數據進度的工具。它可以在數據流經管道時顯示:

  • 進度條
  • 傳輸速度
  • 已傳輸的數據量
  • 估計剩餘時間
  • 平均傳輸速率

安裝 PV

Ubuntu/Debian

1
sudo apt-get install pv

CentOS/RHEL/Fedora

1
2
3
4
5
# CentOS/RHEL
sudo yum install pv

# Fedora
sudo dnf install pv

macOS

1
brew install pv

基本用法

基本語法

1
pv [選項] 輸入文件 | mysql [mysql選項] 數據庫名

簡單範例

1
pv backup.sql | mysql -u root -p mydatabase

帶有詳細信息的範例

1
pv -p -t -r -b -e backup.sql | mysql -u root -p mydatabase

進階用法

1. 指定文件大小以獲得準確的進度

1
pv -s $(stat -c%s backup.sql) backup.sql | mysql -u root -p mydatabase

2. 使用 gzip 壓縮文件

1
pv backup.sql.gz | gunzip | mysql -u root -p mydatabase

3. 從遠程服務器導入

1
pv backup.sql | mysql -u root -p -h remote-server.com mydatabase

4. 導入到特定數據庫並顯示詳細信息

1
pv -p -t -r -b -e -a backup.sql | mysql -u root -p -v mydatabase

PV 指令選項詳解

選項長選項說明
-p--progress顯示進度條
-t--timer顯示自開始以來的經過時間
-r--rate以每秒字節數顯示傳輸速率
-b--bytes顯示傳輸的字節數
-e--eta估計剩餘時間
-a--average-rate顯示平均傳輸速率
-s--size指定輸入數據的總大小
-n--numeric只顯示數字,不顯示進度條
-q--quiet安靜模式,不顯示任何輸出
-l--line-mode按行計數而不是按字節計數

實際使用範例

範例 1:監控大型備份導入

1
2
# 顯示所有監控信息
pv -p -t -r -b -e -a large_backup.sql | mysql -u root -p production_db

輸出範例:

1
1.2GB 0:05:23 [3.2MB/s] [=====>         ] 45% ETA 0:06:32

範例 2:壓縮文件導入

1
2
# 導入壓縮的備份文件
pv compressed_backup.sql.gz | gunzip | mysql -u root -p mydatabase

範例 3:從標準輸入導入

1
2
# 從其他命令的輸出導入
mysqldump -u root -p source_db | pv | mysql -u root -p target_db

性能優化建議

1. 調整 MySQL 參數

在導入大型文件時,可以臨時調整 MySQL 參數以提高性能:

1
2
3
4
5
6
mysql -u root -p -e "
SET SESSION sql_log_bin = 0;
SET SESSION unique_checks = 0;
SET SESSION foreign_key_checks = 0;
SET SESSION autocommit = 0;
"

2. 使用更高效的導入方式

1
pv backup.sql | mysql -u root -p --init-command="SET SESSION sql_log_bin=0; SET SESSION unique_checks=0; SET SESSION foreign_key_checks=0;" mydatabase

故障排除

常見問題

  1. 進度條不準確

    • 使用 -s 選項指定文件大小
    • 確保文件沒有被壓縮
  2. 導入速度慢

    • 檢查 MySQL 配置
    • 考慮調整 innodb_buffer_pool_size
    • 暫時禁用外鍵檢查
  3. 內存不足

    • 分批導入大型文件
    • 使用 split 命令分割文件

總結

使用 pv 監控 MySQL 數據導入是一個簡單而有效的方法,特別適合處理大型數據庫備份。它不僅提供了進度可視化,還能幫助我們估算完成時間,讓數據導入過程更加透明和可控。

通過結合適當的 MySQL 參數調整,我們可以顯著提高導入效率,同時保持對整個過程的完全控制。


使用 Hugo 建立
主題 StackJimmy 設計