[MySQL]資料庫的備份與還原
資料庫匯出/備份
1. 備份單一資料庫:
$ mysqldump -u Username -p --opt DatabaseName > Backup.sql
2. 僅備份特定資料庫下的資料表:
$ mysqldump -u Username -p --opt DatabaseName Table1 Table2... > Backup.sql
3. 僅匯出資料表結構:
$ mysqldump -u Username -p --opt --no-data DatabaseName > Backup.sql
4. 備份全部的資料庫:
$ mysqldump -u Username -p -A --opt > AllBackup.sql
mysql/mysqldump/mysqladmin 與「登入」有關的參數說明:
- -u Username: 用來存取 mysql 資料表的用戶名稱。此參數可省略,若省略,則表示為目前登入 linux 的用戶名稱。
- -p: 於執行時再詢問密碼。
- -pPassword: 用來存取 mysql 資料表的密碼,-p 與 Password 的中間不可有空格。
資料庫匯入/還原
1. 建立資料庫,再從備份檔匯入單一資料庫:
$ mysqladmin -u Username -p create DatabaseName
$ mysql -u Username -p DatabaseName < Backup.sql
2. 從備份檔匯入全部的資料庫 (不需先建立資料庫):
$ mysql -u Username -p < AllBackup.sql
狀況處理:
狀況 1.
匯入資料庫時出現錯誤訊息: Unknown collation: 'utf8mb4_unicode_ci' 或 Unknown collation: 'utf8mb4_unicode_520_ci'
說明:
MySQL 於 v5.5.3 版之後才有「utf8mb4」的編碼格式。原本 utf8 的最大編碼長度為 3bytes,而 utf8mb4 的最大編碼長度為 4bytes,因此它比 utf8 可以儲存更多的字元。但是以常用的文字來講,utf8 已經完全足夠使用了。若不昇級 MySQL Server,則只須將匯入的字元編碼格式改為原本的 utf8。
解決方法:
先將備份檔中的 utf8mb4 字串替換成 utf8: (以下的三行指令需依照順序執行)
$ sed -i 's/utf8mb4_unicode_ci/utf8_general_ci/g' Backup.sql $ sed -i 's/utf8mb4_unicode_520_ci/utf8_general_ci/g' Backup.sql $ sed -i 's/utf8mb4/utf8/g' Backup.sql
全部替換完再進行匯入:
$ mysql -u Username -p DatabaseName < Backup.sql
狀況 2.
以 mysqldump 匯出資料庫時出現錯誤訊息: Got error: 1044: Access denied for user 'backup'@'localhost' to database 'test' when using LOCK TABLES
說明:
這錯誤訊息已說明了用來執行 mysqldump 的帳號沒有「LOCK TABLES」權限! 通常用 root 帳號匯出資料庫不會發生這個問題,因為我們會給 root 所有的權限。然而我們在設定其它帳號時可能會忘了給它設定「LOCK TABLES」權限,而執行 mysqldump 至少需要「SELECT」與「LOCK TABLES」權限才行,最好再加上「SHOW VIEW」、「EVENT」與「TRIGGER」。
解決方法:
重新授予用戶權限:
grant SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER on *.* to 'backup'@'localhost' identified by '{Password}';
flush privileges;
狀況 3.
從 cpanel 下載的 MySQL 檔案格式為 *.gz,可以用 gunzip 解壓縮:
$ gunzip Backup.sql.gz
注意: 使用 gunzip 解壓縮後,原本的 *.gz 會被刪除!!若要保留舊檔,須改用下列指令:
$ gunzip -c Backup.sql.gz > Backup.sql
資料庫離線備份/還原
MySQL 的資料庫放在 /var/lib/mysql 下,以資料庫的名稱做為目錄的名稱。直接將 /var/lib/mysql 下的資料庫目錄用 tar 指令個別壓縮起來即可做為備份。要還原再把檔案解壓縮回去。
要以這種方式執行備份與還原都必須先停止 MySQL 的服務:
$ service mysqld stop
近期迴響