Linux下MySQL的寫文件時權限錯誤(Errcode: 13)解決方法

在數據庫中select * into outfile '/home/mysql/data.sql',mysql又提示錯誤:

  1. ERROR 1 (HY000): Can't create/write to file '/home/mysql/data.sql' (Errcode: 13)  



權限錯誤(Errcode: 13)解決方法

1  查看導出目錄的權限 是否有mysql用戶寫的權限

2 如果有多級目錄,要確保到處目錄的上級目錄有可執行權限,如果是/root目錄 700要修改705 否則寫不進

3  查看 seLinux 有沒有關閉 ,如果沒有關閉可以 setsebool -a 看看 然後 確保 setsebool -P mysqld_disable_trans=1 


以下爲網友的分享:

=========================================================================


用select * into outfile '/home/mysql/data.sql',mysql又提示錯誤:

  1. ERROR 1 (HY000): Can't create/write to file '/home/mysql/data.sql' (Errcode: 13)  

看錯誤代號,應該還是權限的問題。之前也遇到過類似錯誤,如果導出到/tmp目錄下是沒問題的。可是通過“ls -l”命令,證實/home/mysql已經全部改成mysql用戶了,而且也具有讀寫的權限,爲什麼仍是不能操作呢?

在絕望之餘,終於在網上找到最終解決方法:

  1. # setsebool -P mysqld_disable_trans=1  

執行上述命令後,重啓mysql服務,日誌終於生成了。select * into outfile也正常執行了,大功告成!!!


以下摘錄了網頁中的詳細介紹,具體網址不記得了。

  1. 在red hat系列的linux中selinux對哪些daemon可以進行怎麼樣的操作是有限制的,mysql的select into outfile的命令是mysql的daemon來負責寫文件操作的。寫文件之前當然要具有寫文件的權限。而selinux對這個權限做了限制。如果selinux是關閉的吧,這個命令執行是沒有問題的  

  2. mysql> select user from user into outfile '/home/test.txt';  

  3. Query OK, 2 rows affected (0.02 sec)  

  4. 當時selinux開啓時  

  5. selinux對mysql的守護進程mysqld進行了限制。  

  6. mysql> select user from user into outfile '/home/test.txt';  

  7. ERROR 1 (HY000): Can't create/write to file '/home/test.txt' (Errcode: 13)   

  8. 出現了沒有權限寫的error。  

  9. 解決方法,可以關閉selinux。  

  10. 可以在/etc/selinux中找到config  

  11. root用戶,  

  12. shell>vi /etc/selinux/config  

  13.   

  14. # This file controls the state of SELinux on the system.  

  15. # SELINUX= can take one of these three values:  

  16. # enforcing - SELinux security policy is enforced.  

  17. # permissive - SELinux prints warnings instead of enforcing.  

  18. # disabled - SELinux is fully disabled.  

  19. SELINUX=enforcing  

  20.   

  21. 修改SELINUX=disabled關閉selinux就可以了,這個問題就可以解決了。  

  22. 不過全部關閉SELINUX有帶來一些安全問題。  

  23. 當然也可以,單獨給mysql的守護進程權限,  

  24. shell>getsebool -a可以查看當前的對系統一系列守護進程的權限情況。  

  25.   

  26. lpd_disable_trans --> off  

  27. mail_read_content --> off  

  28. mailman_mail_disable_trans --> off  

  29. mdadm_disable_trans --> off  

  30. mozilla_read_content --> off  

  31. mysqld_disable_trans --> off  

  32. nagios_disable_trans --> off  

  33. named_disable_trans --> off  

  34. named_write_master_zones --> off  

  35. nfs_export_all_ro --> on  

  36. nfs_export_all_rw --> on  

  37. nfsd_disable_trans --> off  

  38. nmbd_disable_trans --> off  

  39. nrpe_disable_trans --> off  

  40.   

  41. shell>setsebool -P mysqld_disable_trans=1  

  42. 開啓對mysql守護進程的權限,這樣  

  43. mysql> select user from user into outfile '/home/test.txt';  

  44. 寫入到自定義的目錄就沒有問題了。  

  45. -P表示 是永久性設置,否則重啓之後又恢復預設值。  

  46. getsebool setsebool命令在root用戶下有權限。  

  47.   

  48. 除了對selinux的權限,當然首先要保證該目錄擁有讀寫權限。  

  49.   

  50.   

  51. Ubuntu下 ,可以對AppArmor(/etc/apparmor.d/usr.sbin.mysqld) 修改,類似selinux。  

  52. 添加/etc/squid/lists/eighties.txt w,類似。  



  1. 關閉mysql: service mysqld stop

  2. 複製文件:cp -R /vqr/lib/mysql /xvdb1/

  3. 重命名目錄: mv /var/lib/mysql /var/lib/mysql-backup

  4. 鏈接文件: ln -s /xvdb1/mysql /var/lib/mysql

  5. 修改目錄權限:

  • chown mysql:mysql /xvdb1/mysql -R

  • chown -h mysql:mysql /var/lib/mysql

修改selinux的content type
  • chcon -R -t mysqld_db_t /xvdb1/mysql

  • chcon -h mysqld_db_t /var/lib/mysql

重新啓動mysql: service mysqld start

在linux中用ln -s 創建鏈接時,如上面的 ln -s /xvdb1/mysql /var/lib/mysql,對每個鏈接,同時關聯兩個對象,即鏈接本身以及鏈接所指向的文件。如/var/lib/mysql,本身是一個鏈接,同時指向一個實際的目錄 /xvdb1/mysql。當在鏈接上使用chown或chcon時,默認修改的是鏈接指向的對象,即/xvdb1/mysql,而不是鏈接本身。爲了修改鏈接本身的owner或context type,需要加上 -h 參數。因此上面chown和chcon都用了兩遍。

附上錯誤信息:

110824  6:55:11 [Warning] Can’t create test file /var/lib/mysql/testemp.lower-test
110824  6:55:11 [Warning] Can’t create test file /var/lib/mysql/testemp.lower-test
/usr/libexec/mysqld: Can’t change dir to ‘/var/lib/mysql/’ (Errcode: 13)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章