2010-11-15 70 views
11

在我的MySQL安裝中,我有一個InnoDB數據庫,我知道它會變得非常大,因此我決定將它移動到它自己的磁盤上。我希望通過將文件移動到另一個磁盤,然後創建一個符號鏈接,但我遇到錯誤!將MySQL InnoDB數據庫移動到單獨的驅動器

這是我做了什麼:

1)在my.cnf中我已經設置

的[mysqld] innodb_file_per_table

(這工作,我在每一個.FRM的.ibd數據庫文件夾。)

2)我已經確認,如果符號鏈接都OK與SHOW VARIABLES LIKE "have_symlink";

(我知道文檔說:

符號鏈接僅完全支持 MyISAM表。對於其他存儲引擎的 表使用的文件,如果您嘗試使用符號鏈接, 可能會出現奇怪的問題。

但我需要的外鍵...)

3)我感動的數據庫文件夾並創建了一個符號鏈接。

4)而重新啓動mysql和嘗試:

mysql> USE db_name 
Database changed 
mysql> SHOW TABLES; 
ERROR 1018 (HY000): Can't read dir of './db_name/' (errno: 13) 
mysql> exit 
[email protected]# perror 13 
OS error code 13: Permission denied 

符號鏈接(如預期)lrwxrwxrwx mysql mysql db_name -> /path-to/db_name/

數據庫文件夾的權限是drwx------ mysql mysql

所有文件的權限是-rw-rw---- mysql mysql

我使用帶有MySQL 5.1.41的Ubuntu 10.04服務器(默認爲apt)。

你們有沒有成功做到這一點?

+0

最簡單的方法是採取mysqldump,然後刪除模式更改配置並導入它,如果你的數據庫不是很大。 – vinothkr 2010-11-15 08:08:39

+0

我想保留系統磁盤上的其餘數據庫(對於drupal等),只將這個特定的數據移出數據目錄。對不起,如果這個問題不明確。 – Norling 2010-11-15 08:13:33

+0

這可能更適合http://serverfault.com/ - 投票遷移它... – richsage 2010-11-15 08:52:52

回答

16

結果如此,但我的老敵人appArmor阻止MySQL讀取移動的目錄。

sudo nano /etc/apparmor.d/usr.sbin.mysqld 

附加線:

/new-db-path/ r, 
/new-db-path/** rwk, 

感謝您的幫助了!

+0

移動數據庫並用符號鏈接替換它之後,Ubuntu 12.04上的同樣的問題。按照您的建議編輯AppArmor配置文件。謝謝! – 2012-07-20 17:46:40

+0

謝謝。這也是我的解決方案。 – Yada 2013-02-02 06:49:44

+0

謝謝!在Ubuntu 12.10上更改 – 2014-01-31 21:51:40

10

諾林小救了我一天的AppArmor的小費,但因爲我遇到了一些麻煩它配置,我正在寫一個更詳細的答案。我使用的是Ubuntu 12.04。

開始成爲root用戶保存需要鍵入所有sudos:​​

sudo su - 

MySQL docs,您首先將你的已經創建數據庫目錄到其他路徑:

mv /var/lib/mysql/yourdatabase /new/path/ 

這裏是我的第一個陷阱。檢查MySQL的用戶可以訪問這個新的路徑:

sudo -u mysql ls /new/path/yourdatabase 

如果你有拒絕訪問,你應該給予執行權限每個父目錄:

chmod a+x /new /new/path/ 

測試再次訪問該文件。如果仍然不行,試着問在堆棧溢出問題:-)

鏈接新的目錄位置,並給它正確的權限:

ln -s /new/path/yourdatabase /var/lib/mysql/ 
chown mysql:mysql /var/lib/mysql/yourdatabase 

讓我們編輯AppArmor的本地配置文件。你不要更改/etc/apparmor.d/usr.sbin.mysqld文件。編輯本地的conf這樣你就不會系統更新後,鬆動的那樣:

emacs /etc/apparmor.d/local/usr.sbin.mysqld 

添加諾林小配置:

/new/path/yourdatabase/ r, 
/new/path/yourdatabase/** rwk, 

不要錯過最後一個逗號。保存文件並重新加載AppArmor的配置:

apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld 

這將不只是重新加載AppArmor的MySQL配置,也考驗,如果沒有任何語法錯誤(非常重要的事情)。如果您不運行解析器,則新的conf將不會被應用。

最後只需打開mysql客戶端並鍵入SHOW DATABASES即可。如果你的數據庫出現了,一切都很好。輸入'USE yourdatabase'進行另一次檢查。

更健壯的測試也會重新加載mysql服務:'服務mysql重新啓動'並嘗試訪問您的數據庫。

現在我會記得下一次我需要這樣做。谷歌和SO一起爲世界上最好的筆記本電腦:-)

+2

這非常有幫助,謝謝! – 2012-12-21 04:00:41

1

應該可以使用本地坐騎(綁定)具有相應權限,並安裝oprions(包括新的SELinux或AppArmor的上下文):

/dev/sdc on /var/lib/mysql/my-db/ 
/dev/sdd on /var/lib/mysql/her-db/ 
fs.example.com:/path/to/wherever on /var/lib/mysql/my-other-db/ 

雖然我還沒有測試過這個解決方案,所以使用需要您自擔風險。

+0

我可以證實這個作品。您必須將整個分區專用於mysql子目錄,但一旦您完成並正確安裝,它就會很好。 – GaryO 2015-02-05 16:09:25

相關問題