1. 程式人生 > >讓天下沒有難用的資料庫 » 預設臨時目錄帶來的許可權問題

讓天下沒有難用的資料庫 » 預設臨時目錄帶來的許可權問題

一客戶的本地資料庫發現不能對其中的表進行查詢,無法進行任何操作,聯絡我進行排查:
登入資料庫:

[[email protected] tmp]# mysql -u root -pxxxxx
Welcome TO the MySQL monitor.  Commands END WITH ; OR \g.
Your MySQL connection id IS 2
Server version: 5.0.77 SOURCE distribution
 
TYPE 'help;' OR '\h' FOR help. TYPE '\c' TO clear the buffer.
 
mysql>
USE customperformance2; DATABASE changed mysql> SELECT COUNT(*) FROM erp_user; ERROR 1033 (HY000): Incorrect information IN file: '.\customperformance2\erp_user.frm' mysql> DESC erp_user; ERROR 1 (HY000): Can't create/write to file '/tmp/#sql_13b3_0.MYI' (Errcode: 13)
$perror 13
OS error code  13
: Permission denied

為什麼會出現這樣的錯誤,為什麼會報沒有許可權的錯誤?由於使用者環境還不是很熟悉,先要了解一下使用者資料庫的安裝情況:

[[email protected] tmp]# lsof -nc mysqld | grep -vE '(\.so(\..*)?$|\.frm|\.MY?|\.ibd|ib_logfile|ibdata|TCP)'
COMMAND    PID  USER   FD   TYPE             DEVICE     SIZE     NODE NAME
mysqld_sa 5002  root  cwd    DIR              253
,0 4096 2 / mysqld_sa 5002 root rtd DIR 253,0 4096 2 / mysqld_sa 5002 root txt REG 253,0 801512 262190 /bin/bash mysqld_sa 5002 root mem REG 253,0 56458704 59476863 /usr/lib/locale/locale-archive mysqld_sa 5002 root mem REG 253,0 25464 59572719 /usr/lib64/gconv/gconv-modules.cache mysqld_sa 5002 root 0r CHR 1,3 2127 /dev/NULL mysqld_sa 5002 root 1w CHR 1,3 2127 /dev/NULL mysqld_sa 5002 root 2w CHR 1,3 2127 /dev/NULL mysqld_sa 5002 root 255r REG 253,0 13073 59486803 /usr/bin/mysqld_safe mysqld 5043 mysql cwd DIR 253,0 4096 63013326 /var/lib/mysql mysqld 5043 mysql rtd DIR 253,0 4096 2 / mysqld 5043 mysql txt REG 253,0 7721832 59480637 /usr/libexec/mysqld mysqld 5043 mysql 0r CHR 1,3 2127 /dev/NULL mysqld 5043 mysql 1w REG 253,0 405427 62980617 /var/log/mysqld.log mysqld 5043 mysql 2w REG 253,0 405427 62980617 /var/log/mysqld.log mysqld 5043 mysql 4u unix 0xffff81031a97b1c0 22639 /var/lib/mysql/mysql.sock mysqld 5043 mysql 18u unix 0xffff8103312ecf00 22662 /var/lib/mysql/mysql.sock

使用者的資料目錄/var/lib/mysql:

[[email protected] log]# ls -lh /var/lib/mysql
總計 208G
drwxrwxrwx 2 mysql mysql  16K 05-10 01:22 customperformance2
-rwxrwxrwx 1 mysql mysql 208G 09-29 19:17 ibdata1
-rwxrwxrwx 1 mysql mysql 5.0M 09-29 19:17 ib_logfile0
-rwxrwxrwx 1 mysql mysql 5.0M 09-29 19:17 ib_logfile1
drwxrwxrwx 2 mysql mysql 4.0K 2011-05-30 keepsession
drwxrwxrwx 2 mysql mysql 4.0K 2011-05-30 mysql
-rwxrwxrwx 1 mysql mysql    1 07-07 17:08 mysql-bin.INDEX
srwxrwxrwx 1 mysql mysql    0 09-29 16:05 mysql.sock
drwxrwxrwx 2 mysql mysql 4.0K 2011-12-14 receiver_analyse
drwxrwxrwx 2 mysql mysql 4.0K 2011-05-30 test
drwxrwxrwx 2 mysql mysql  20K 2011-12-30 weibopromotion
You have NEW mail IN /var/spool/mail/root

可以看到目錄的許可權是正確的,這個時候在看看資料庫的errorlog中有沒有開排查的資訊:

vi /var/log/mysqld.log
120929 15:57:15  mysqld ended
120929 15:57:15  mysqld started
^G/usr/libexec/mysqld: Can't create/write to file '/tmp/ibKbaUfl' (Errcode: 13)
120929 15:57:16  InnoDB: Error: unable to create temporary file; errno: 13
檢視/tmp目錄的許可權
[[email protected] tmp]# ls  -lh /tmp/
總計 20K
drwx------ 2 root root 16K 09-29 11:37 lost+found
-rw-r--r-- 1 root root   0 09-29 12:00 tmp_domain

這裡已經很明確了,mysql沒有許可權對/tmp進行操作:
這個時候我們可以有兩種辦法,一種為改變/tmp的許可權,另一種為改變資料庫的臨時目錄;我採取了修改資料庫臨時目錄的方法:

vi /etc/my.cnf
# Point the following paths TO different dedicated disks
# tmpdir          = /tmp
#log-UPDATE     = /path-to-dedicated-directory/hostname

可以看到使用者的tmpdir變數並沒有指定,被註釋掉,所以資料庫會預設指定到/tmp目錄;
修改其臨時目錄到使用者的資料目錄:

# Point the following paths TO different dedicated disks
 tmpdir          = /var/lib/mysql/
#log-UPDATE     = /path-to-dedicated-directory/hostname

重啟mysql後,資料庫恢復正常。