在數據庫中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進行了限制。
mysql> select user from user into outfile '/home/test.txt';
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守護進程的權限,這樣
mysql> select user from user into outfile '/home/test.txt';
寫入到自定義的目錄就沒有問題了。
-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
chcon -R -t mysqld_db_t /xvdb1/mysql
chcon -h mysqld_db_t /var/lib/mysql
在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)