Skip to content

Nuface Blog

隨意隨手記 Casual Notes

Menu
  • Home
  • About
  • Services
  • Blog
  • Contact
  • Privacy Policy
  • Login
Menu

在 Docker 容器中匯入 MariaDB SQL 檔案 — 實務筆記

Posted on 2025-11-052025-11-05 by Rico

本文記錄如何在 Docker 容器中執行 MariaDB (12.1.1) 的 SQL 匯入作業,並說明常見錯誤與修正方式,方便日後備查。


一、背景說明

在維運環境中,我們常會在 Docker 容器中部署 MariaDB 資料庫,並需要將備份的 .sql 檔或 .sql.gz 壓縮檔匯入。

以本次環境為例:

項目設定值
容器名稱blognufacedb
MariaDB 版本12.1.1-MariaDB
帳號nuface
密碼abcd123
資料庫名稱nuface
匯入檔案nuface_2025-09-16.sql

二、原始執行指令

docker exec -i blognufacedb mariadb -u nuface -p 'abcd123' --default-character-set=utf8mb4 nuface < nuface_2025-09-16.sql

執行後出現以下訊息:

mariadb from 12.1.1-MariaDB, client 15.2 for Linux (x86_64) using EditLine wrapper
Copyright (c) 2000, 2018, Oracle...
Usage: mariadb [OPTIONS] [database]
...

MariaDB 並未執行匯入,而是列出整份使用說明。


三、問題原因

造成問題的主因是:

-p 後面多了一個空白
MariaDB 會將 'abcd123' 視為「資料庫名稱」而非密碼,導致參數順序錯亂,程式直接輸出說明文件。


四、正確匯入方式

✅ 方法 1:-p'密碼'(不能有空白)

docker exec -i blognufacedb \
  mariadb -u nuface -p'abcd123' --default-character-set=utf8mb4 nuface \
  < nuface_2025-09-16.sql

✅ 方法 2:使用 --password=密碼

docker exec -i blognufacedb \
  mariadb -u nuface --password='abcd123' --default-character-set=utf8mb4 nuface \
  < nuface_2025-09-16.sql

✅ 方法 3:使用環境變數(推薦)

這方式可避免密碼出現在指令列(提高安全性):

docker exec -i -e MYSQL_PWD='abcd123' \
  blognufacedb mariadb -u nuface --default-character-set=utf8mb4 nuface \
  < nuface_2025-09-16.sql

五、匯入壓縮檔(.sql.gz)

gunzip -c nuface_2025-09-16.sql.gz | \
docker exec -i -e MYSQL_PWD='abcd123' \
  blognufacedb mariadb -u nuface --default-character-set=utf8mb4 nuface

六、進階選項(大檔案或特殊環境)

若要匯入大型資料庫,可加上:

--max-allowed-packet=512M \
--init-command="SET time_zone='+08:00'; SET FOREIGN_KEY_CHECKS=0;"

範例如下:

docker exec -i -e MYSQL_PWD='abcd123' \
  blognufacedb mariadb -u nuface --default-character-set=utf8mb4 nuface \
  --max-allowed-packet=512M \
  --init-command="SET time_zone='+08:00'; SET FOREIGN_KEY_CHECKS=0;" \
  < nuface_2025-09-16.sql

七、小提醒

  • 若匯出檔中已包含 CREATE DATABASE / USE nuface;,可省略命令中的資料庫名稱。
  • 若出現 ERROR 1227 (42000): Access denied,通常是權限不足(例如有 DEFINER 的 View 或 Routine),建議使用具備 CREATE ROUTINE 或 SUPER 權限的帳號。
  • 匯入前可檢查是否連線成功: docker exec -it blognufacedb mariadb -u nuface -p'abcd123' -e "SELECT VERSION();"

八、總結

在 Docker 容器中匯入 MariaDB 資料時,常見的問題多半是參數格式錯誤。
記住以下要點即可快速完成匯入:

重點說明
-p 後不能有空白否則會被誤判為資料庫名稱
可用 MYSQL_PWD 避免密碼外洩更安全的做法
匯入壓縮檔可直接用 `gunzip -cdocker exec -i`
大型資料庫建議加上 --max-allowed-packet 與 --init-command提高成功率

📌 延伸閱讀

  • mysqldump 匯出語法筆記 (MySQL / MariaDB 5.5)
  • Docker + MariaDB 備份與還原最佳實務

Recent Posts

  • Postfix + Let’s Encrypt + BIND9 + DANE Fully Automated TLSA Update Guide
  • Postfix + Let’s Encrypt + BIND9 + DANE TLSA 指紋自動更新完整教學
  • Deploying DANE in Postfix
  • 如何在 Postfix 中部署 DANE
  • DANE: DNSSEC-Based TLS Protection

Recent Comments

  1. Building a Complete Enterprise-Grade Mail System (Overview) - Nuface Blog on High Availability Architecture, Failover, GeoDNS, Monitoring, and Email Abuse Automation (SOAR)
  2. Building a Complete Enterprise-Grade Mail System (Overview) - Nuface Blog on MariaDB + PostfixAdmin: The Core of Virtual Domain & Mailbox Management
  3. Building a Complete Enterprise-Grade Mail System (Overview) - Nuface Blog on Daily Operations, Monitoring, and Performance Tuning for an Enterprise Mail System
  4. Building a Complete Enterprise-Grade Mail System (Overview) - Nuface Blog on Final Chapter: Complete Troubleshooting Guide & Frequently Asked Questions (FAQ)
  5. Building a Complete Enterprise-Grade Mail System (Overview) - Nuface Blog on Network Architecture, DNS Configuration, TLS Design, and Postfix/Dovecot SNI Explained

Archives

  • December 2025
  • November 2025
  • October 2025

Categories

  • AI
  • Apache
  • Cybersecurity
  • Database
  • DNS
  • Docker
  • Fail2Ban
  • FileSystem
  • Firewall
  • Linux
  • LLM
  • Mail
  • N8N
  • OpenLdap
  • OPNsense
  • PHP
  • QoS
  • Samba
  • Switch
  • Virtualization
  • VPN
  • WordPress
© 2025 Nuface Blog | Powered by Superbs Personal Blog theme