Lỗi mysql 13

Hôm nay đang xử lý hệ thống với công việc export database của 1 con server còng thì gặp phải thông báo lỗi này của “mysqldump” thì thấy đây cũng là 1 cái bug khá phổ biến và linh tinh. Nên giờ mình cũng muốn chia sẻ cái cách giải quyết cho cái vấn đề nhỏ xíu xiu này trong bài viết hôm nay

Error it will look like this this

# mysqldump -u mv -p cuongquach > /root/cuongquach.sql
Password:
mysqldump: Error: 'Can't create/write to file '/tmp/#sql_8h9_1.MYI' (Errcode: 13)' when trying to dump tablespaces
mysqldump: Couldn't execute 'show fields from `logs`': Can't create/write to file '/tmp/#sql_3c4_0.MYI' (Errcode: 13) (1)

 
Đọc thông báo lỗi trên thì có thể thấy mysqldump đang cố gắng ghi dữ liệu xuống thư mục /tmp trong quá trình export database nhưng bất thành dù cho mình lưu dữ liệu export ở 1 thư mục khác.

Ngoài ra, lỗi này vẫn xảy ra trong bảng điều khiển MySQL khi mình sử dụng một số câu lệnh như 'mô tả'. Ví dụ

mysql> describe logs;
ERROR 1 (HY000): Can't create/write to file '/tmp/#sql_5y7_0.MYI' (Errcode: 13)

 
Nguyên nhân.

Các chương trình dịch vụ MySQL hay 1 số câu lệnh thực thi trong bảng điều khiển MySQL luôn cần ghi nội dung của tệp tạm thời (tệp tạm thời) trong thời gian xử lý hoạt động của chúng vào 1 directory được chỉ định. Mà thông thường mặc định sẽ là directory /tmp/ , nên nếu lúc này user mysql không thể ghi file vào thư mục đó chứng tỏ permission của thư mục /tmp/ đã không đúng mặc định hoặc không cho phép user thao tác ghi (write) trên thư mục đó. Ta sẽ cần phân quyền lại cho chính xác thư mục “/tmp/” này hoặc thư mục tạm được bạn cấu hình cho hoạt động dịch vụ MySQL, ở đây mình sử dụng mặc định /tmp/ làm thư mục tạm cho dịch vụ MySQL nhé.

 
Giải quyết.

Khi mình kiểm tra thì phân quyền của thư mục này là “0755“, không chính xác vì thư mục /tmp còn có cả đặc tính Sticky Bit và quyền mặc định trên các hệ thống là “777“. Nên bây giờ mình phân quyền lại cho chính xác thì lỗi trên đã được sửa. Quyền mặc định của thư mục “/tmp” là “ 1777 ” nhé.

# chmod 1777 /tmp/

 
Sau đó, bạn hãy thử lại các chương trình và lệnh trên nhé. Không yêu cầu khởi động lại dịch vụ MySQL.

  • THẺ
  • mysql

Facebook

Twitter

Pinterest

WhatsApp

liên kết

điện báo

Bài viết trước [MySQL] Hướng dẫn cấu hình đăng nhập bảng điều khiển MySQL không cần nhập user-pass

Bài viết tiếp theo [MySQL] Phân biệt sự khác nhau giữa tiến trình “mysqld” và “mysqld_safe” trên MySQL

Lỗi mysql 13

Quách Chí Cường

https. //cuongquach. com/

Bạn đang theo dõi website " https. //cuongquach. com/" nơi lưu trữ những kiến ​​thức tổng hợp và chia sẻ cá nhân về Quản trị Hệ thống Thống kê Dịch vụ & Mạng, được xây dựng lại dưới nền tảng kinh nghiệm của bản thân mình, Quách Chí Cường. Hy vọng bạn sẽ thích nơi này

Theo mặc định cơ sở dữ liệu MySQL sẽ được tạo ra trong thư mục /var/lib/mysql.
Điều chỉnh này có thể phù hợp nếu bạn đang chạy một cơ sở dữ liệu nhỏ mà không chiếm nhiều không gian. Nhưng về thực tế, đối với một cơ sở dữ liệu lớn hơn, bạn không thể có đủ không gian bên dưới phân vùng gốc.

Trong trường hợp đó, bạn có thể muốn chuyển cơ sở dữ liệu MySQL của bạn từ phân vùng gốc sang một phân vùng khác.

Để thay đổi thư mục MySQL, ở mức độ cao, bạn phải thực hiện ba bước sau đây.
  • Di chuyển các tập tin cơ sở dữ liệu MySQL từ /var/lib/mysql vào một phân vùng khác
  • Sửa đổi tập tin của tôi. cnf with new directory position
  • Cập nhật thiết lập bảo mật để phù hợp với sự thay đổi thư mục. Trên CentOS hoặc RedHat, đã sửa đổi cài đặt SELinux. Trên Ubuntu hoặc Debian, đã sửa đổi thiết lập AppArmor
Hướng dẫn này giải thích chi tiết về cách làm thế nào để thực hiện ba bước trên giúp chuyển dữ liệu MySQL của bạn vào một thư mục khác.

Sao lưu MySQL hiện tại
Trước khi bạn làm bất cứ điều gì, hãy dừng cơ sở dữ liệu MySQL và sao lưu cơ sở dữ liệu MySQL hiện tại .
Theo mặc định MySQL lưu trữ dữ liệu tại thư mục /var/lib/mysql. Sao chép thư mục mysql này đến một vị trí khác để sao lưu.

Mã.

service mysqld stop
mkdir -p /backup
cp -r /var/lib/mysql /backup/mysql

Hoặc, nếu thích, bạn có thể sử dụng mysqldump để có bản sao lưu MySQL DB.

Di chuyển dữ liệu thư mục MySQL sang phân vùng khác
Trong ví dụ này, phân vùng gốc của tôi là /dev/sda1 và không có nhiều khoảng trống . Nhưng tôi có phân vùng dữ liệu trên /dev/sdb1, trong đó có rất nhiều không gian.

Vì vậy, tôi sẽ chuyển cơ sở dữ liệu MySQL từ phân vùng gốc sang phân vùng /dev/sdb1.
Create directory and di convert mysql data from /var/lib to /data/var/lib as after.

Mã.

mkdir -p /data/var/lib
cd /var/lib
mv mysql /data/var/lib/

Những điểm cần xem xét.
  • Nếu có thể, hãy cố gắng sử dụng lệnh move để di chuyển các thư mục trên (thay vì sao chép). Khi bạn thực hiện các bản sao, SELinux context sẽ bị mất và bạn phải tự thiết lập lại sau này (sẽ được giải thích dưới đây).
  • Tuy nhiên, khi bạn chuyển đổi, bối cảnh SELinux thích hợp cho MySQL được lưu giữ nguyên trạng và bạn không phải lo lắng về việc thay đổi nó
  • Ngoài ra, nếu bạn đã sao chép các thư mục (thay vì di chuyển), hãy chắc chắn rằng bạn thay đổi quyền sở hữu theo một cách thích hợp. Nếu không, bạn có thể nhận được thông báo lỗi này. l Lỗi MySQL. 1017Không thể tìm thấy tập tin. (lỗi. 13)
Sửa lỗi bằng lệnh sau.

Mã.

chown -R mysql: mysql / data

Sửa my. cnf và khởi động MySQL
Trong tệp /etc/my. cnf, bạn cần phải sửa đổi cả hai tham số datadir và ổ cắm con trỏ vào thư mục mới như dưới đây.

Mã.

# vi /etc/my.cnf
datadir=/data/var/lib/mysql
socket=/data/var/lib/mysql/mysql.sock

Cuối cùng, khởi động lại cơ sở dữ liệu MySQL.

Mã.

# service mysqld start
Starting mysqld:  [  OK  ]

If you have a tham số tmpdir đã được định nghĩa trong my file. cnf của bạn, thay đổi thư mục của các tham số như sau.

Mã.

________số 8

Sau khi thay đổi datadir và socket trong my file. cnf, nếu MySQL không bắt đầu hoặc có lỗi thông báo quyền truy cập bị từ chối, thì bạn cần phải thiết lập các SELinux (hoặc Apparmor) như được giải thích dưới đây.

SELinux Context Type for MySQL
Sử dụng lệnh ls -Z để xem SELinux context. Trước khi di chuyển các thư mục, sau đây là bối cảnh SELinux trên cơ sở dữ liệu MySQL của tôi. Trong ví dụ này, "aluhost" là cơ sở dữ liệu MySQL trong thư mục /var/lib/mysql.

Như bạn đã thấy ở đây, mysqld_db_t là kiểu ngữ cảnh SELinux.

Mã.

# ls -Z /var/lib/mysql
drwx------. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 aluhost
-rw-rw----. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 ibdata1
-rw-rw----. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 ib_logfile0

Sau khi di chuyển thư mục đến vị trí mới, bạn sẽ thấy chính xác các SELinux như trước khi di chuyển.

Mã.

mysql> describe logs;
ERROR 1 (HY000): Can't create/write to file '/tmp/#sql_5y7_0.MYI' (Errcode: 13)
0

Lưu ý. Nếu bạn đã sao chép thư mục (thay vì di chuyển), bạn sẽ thấy rằng nó đã thay đổi. Trong trường hợp đó, thay đổi SELinux như được giải thích dưới đây.

Khi điều kiện SELinux bị sai, bạn sẽ thấy thông báo lỗi sau đây (hoặc một cái gì đó tương tự như sau) trong nhật ký kiểm tra của bạn (hoặc /var/log/messages) .

Mã:

mysql> describe logs;
ERROR 1 (HY000): Can't create/write to file '/tmp/#sql_5y7_0.MYI' (Errcode: 13)
1

Ngoài ra, bạn sẽ thấy những điều sau đây trong tệp mysqld. nhật ký của bạn khi MySQL DB không bắt đầu.

Mã.

mysql> describe logs;
ERROR 1 (HY000): Can't create/write to file '/tmp/#sql_5y7_0.MYI' (Errcode: 13)
2

Thiết lập SELinux cho MySQL trên CentOS/RedHat (Lựa chọn 1)
Sử dụng lệnh chcon, bạn có thể thay đổi loại ngữ cảnh SELinux trong thư mục mới như hình bên dưới.

Mã.

mkdir -p /data/var/lib
cd /var/lib
mv mysql /data/var/lib/
0

In command on.
  • -chcon is command to change SELinux context.
  • -R option will đệ quy thay đổi ngữ cảnh cho các thư mục được định trước nhất và tất cả các thư mục con
  • -t tùy chọn được sử dụng để xác định loại ngữ cảnh SELinux nên được thiết lập. Trong ví dụ này, chúng tôi đang thiết lập nó là mysqld_db_t
  • -/data is directory on that command will be done thi
Lưu ý. Bắt đầu thay đổi ngữ cảnh từ các thư mục cấp cao /data (và không phải từ thư mục mysql), trong đó sẽ bao gồm thư mục mysql và tất cả các thư mục con và tập tin.

Thiết lập SELinux cho MySQL trên CentOS/RedHat (Lựa chọn 2)
Sử dụng lệnh restorecon, bạn có thể khôi phục lại ngữ cảnh SELinux đúng loại. Tuy nhiên, trong trường hợp này, bạn nên thông báo cho ngữ cảnh SELinux đúng bằng cách thêm mysqld_db_t vào bản đồ ngữ cảnh SELinux.

Để thêm các loại SELinux vào bản đồ ngữ cảnh, hãy sử dụng lệnh semanage. Cài đặt gói policycoreutils-python trong đó có lệnh semanage.

Mã.

mkdir -p /data/var/lib
cd /var/lib
mv mysql /data/var/lib/
1

Tiếp theo, thực hiện lệnh sau để thiết lập bản đồ ngữ cảnh SELinux trên thư mục mới.

Mã.

mkdir -p /data/var/lib
cd /var/lib
mv mysql /data/var/lib/
2

Trong lệnh trên, chúng tôi có thêm mysqld_db_t đến bản đồ ngữ cảnh cho tất cả các thư mục con và các tệp bên dưới của /datadirectory.

Cuối cùng, sử dụng lệnh restorecon, nó sẽ khôi phục lại bối cảnh SELinux thích hợp vào thư mục /data mới.

Mã.

mkdir -p /data/var/lib
cd /var/lib
mv mysql /data/var/lib/
3

Xác minh rằng việc di chuyển thư mục /data mới và thư mục con mysql có ngữ cảnh SELinux chính xác.

Mã.

mkdir -p /data/var/lib
cd /var/lib
mv mysql /data/var/lib/
4

Lưu ý. Bạn cũng có thể sử dụng tùy chọn -e cùng với fcontext. Điều này sẽ làm cho nhãn ngữ cảnh cho /data và thư mục con của nó tương tự như nhãn ngữ cảnh /var/lib/mysql.

Thiết lập AppArmor cho MySQL trên Ubuntu / Debian
Sau khi di chuyển thư mục dữ liệu MySQL đến một vị trí mới, nếu bạn không làm như sau, trên Ubuntu . “(lỗi. 13)” (sự cho phép bị từ chối).

Sửa đổi tập tin usr. sbin. mysqld like here, and more two lines after here. Don't Quên dấu phẩy ở cuối dòng, đó là điều cần thiết.

Mã.

mkdir -p /data/var/lib
cd /var/lib
mv mysql /data/var/lib/
5

Tiếp theo, thực hiện lệnh sau để phân tích lại tệp cấu hình apparmor mới này cho mysql, và khởi động lại AppArmor.

Mã.

mkdir -p /data/var/lib
cd /var/lib
mv mysql /data/var/lib/
6

Lưu ý. Ngoài ra, bạn cũng có thể thêm một bí danh trong tập tin bí danh AppArmor như dưới đây. Một lần nữa, đừng quên dấu phẩy ở cuối dòng bí danh này.

Mã.

mkdir -p /data/var/lib
cd /var/lib
mv mysql /data/var/lib/
7

Tham số ổ cắm máy khách MySQL
Sau khi thay đổi ở trên, bạn có thể nhận được thông báo lỗi này khi kết nối từ máy khách mysql. LỖI 2002 (HY000). Không thể kết nối với máy chủ MySQL cục bộ thông qua ổ cắm ‘/var/lib/mysql/mysql. sock’ (2)

Mã.

mkdir -p /data/var/lib
cd /var/lib
mv mysql /data/var/lib/
8

Nếu điều đó xảy ra, hãy truyền các tham số -socket tới máy khách mysql, và trỏ tới tệp mysql. sock nằm trong thư mục mới.

Mã.

mkdir -p /data/var/lib
cd /var/lib
mv mysql /data/var/lib/
9

Nếu bạn đang gọi máy khách mysql cục bộ, bạn cũng có thể sử dụng tùy chọn -h và sử dụng 127. 0. 0. 1 like dưới đây. Điều này cũng sẽ tránh được thông báo lỗi mysql. bít tất.

Mã.

chown -R mysql: mysql / data
0