天天看點

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

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

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又提示錯誤:

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

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

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

# setsebool -P mysqld_disable_trans=1  

執行上述指令後,重新開機mysql服務,日志終于生成了。select * into outfile也正常執行了,大功告成!!!

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

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

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

Query OK, 2 rows affected (0.02 sec)  

當時selinux開啟時  

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

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

出現了沒有權限寫的error。  

解決方法,可以關閉selinux。  

可以在/etc/selinux中找到config  

root使用者,  

shell>vi /etc/selinux/config  

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

# SELINUX= can take one of these three values:  

# enforcing - SELinux security policy is enforced.  

# permissive - SELinux prints warnings instead of enforcing.  

# disabled - SELinux is fully disabled.  

SELINUX=enforcing  

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

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

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

shell>getsebool -a可以檢視目前的對系統一系列守護程序的權限情況。  

lpd_disable_trans --> off  

mail_read_content --> off  

mailman_mail_disable_trans --> off  

mdadm_disable_trans --> off  

mozilla_read_content --> off  

mysqld_disable_trans --> off  

nagios_disable_trans --> off  

named_disable_trans --> off  

named_write_master_zones --> off  

nfs_export_all_ro --> on  

nfs_export_all_rw --> on  

nfsd_disable_trans --> off  

nmbd_disable_trans --> off  

nrpe_disable_trans --> off  

shell>setsebool -P mysqld_disable_trans=1  

開啟對mysql守護程序的權限,這樣  

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

-P表示 是永久性設定,否則重新開機之後又恢複預設值。  

getsebool setsebool指令在root使用者下有權限。  

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

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

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

關閉mysql: service mysqld stop

複制檔案:cp -R /vqr/lib/mysql /xvdb1/

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

連結檔案: ln -s /xvdb1/mysql /var/lib/mysql

修改目錄權限:

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

/usr/libexec/mysqld: Can’t change dir to ‘/var/lib/mysql/’ (Errcode: 13)

繼續閱讀