在資料庫中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)