Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL:Lỗi khi thả cơ sở dữ liệu (errno 13; errno 17; errno 39)

Khắc phục nhanh

Nếu bạn chỉ muốn loại bỏ cơ sở dữ liệu bất kể điều gì (nhưng xin vui lòng lần đầu tiên đọc toàn bộ bài đăng:lỗi được đưa ra có lý do và điều quan trọng là phải biết lý do là gì!), bạn có thể:

  • tìm datadir bằng lệnh SHOW VARIABLES WHERE Variable_name LIKE '%datadir%';
  • dừng máy chủ MySQL (ví dụ:service mysql stop hoặc rcmysqld stop hoặc tương tự trên Linux, NET STOP <name of MYSQL service, often MYSQL57 or similar> hoặc thông qua SERVICES.MSC trên Windows)
  • chuyển đến datadir (đây là nơi bạn nên điều tra; xem bên dưới)
  • xoá thư mục có cùng tên với cơ sở dữ liệu
  • khởi động lại máy chủ MySQL và kết nối với nó
  • thực thi CƠ SỞ DỮ LIỆU DROP
  • thế là xong!

Lý do cho Errno 13

MySQL không có quyền ghi trên thư mục mẹ trong đó mydb thư mục nằm.

Kiểm tra nó với

ls -la /path/to/data/dir/         # see below on how to discover data dir
ls -la /path/to/data/dir/mydb   

Trên Linux, điều này cũng có thể xảy ra nếu bạn trộn và kết hợp các gói MySQL và AppArmor / SELinux. Điều xảy ra là AppArmor mong muốn mysqld có dữ liệu của nó trong /path/to/data/dir và cho phép R / W đầy đủ ở đó, nhưng MySQLd là từ một bản phân phối hoặc bản dựng khác và nó thực sự lưu trữ dữ liệu của mình ở nơi khác (ví dụ:/var/lib/mysql5/data/** trái ngược với /var/lib/mysql/** ). Vì vậy, những gì bạn thấy là thư mục có quyền và quyền sở hữu chính xác và nó vẫn cung cấp cho Errno 13 vì apparmor / selinux sẽ không cho phép truy cập vào nó.

Để xác minh, hãy kiểm tra nhật ký hệ thống xem có vi phạm bảo mật không, kiểm tra thủ công cấu hình apparmor / selinux và / hoặc mạo danh người dùng mysql và thử đi tới thư mục var cơ sở, sau đó cd tăng dần cho đến khi bạn ở trong thư mục đích và chạy một cái gì đó như touch aardvark && rm aardvark . Nếu quyền và quyền sở hữu khớp nhau, nhưng những điều trên lại dẫn đến lỗi truy cập, thì rất có thể đó là vấn đề về khung bảo mật.

Lý do cho Errno 39

Mã này có nghĩa là "thư mục không trống". Thư mục chứa một số ẩn tập tin MySQL không biết gì về. Đối với các tệp không ẩn, hãy xem Errno 17. Giải pháp cũng giống như vậy.

Lý do cho Errno 17

Mã này có nghĩa là "tệp tồn tại". Thư mục chứa một số tệp MySQL mà MySQL không cảm thấy muốn xóa. Những tệp như vậy có thể đã được tạo bởi SELECT ... INTO OUTFILE "filename"; lệnh where filename không có con đường. Trong trường hợp này, quy trình MySQL tạo chúng trong thư mục làm việc hiện tại của nó (được thử nghiệm trên MySQL 5.6 trên OpenSuSE 12.3) là thư mục dữ liệu của cơ sở dữ liệu , ví dụ. /var/lib/mysql/data/nameofdatabase .

Khả năng tái tạo:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1676
Server version: 5.6.12-log openSUSE package
[ snip ]    

mysql> CREATE DATABASE pippo;
Query OK, 1 row affected (0.00 sec)

mysql> USE pippo;
Database changed
mysql> SELECT version() INTO OUTFILE 'test';
Query OK, 1 row affected (0.00 sec)

mysql> DROP DATABASE pippo;
ERROR 1010 (HY000): Error dropping database (can't rmdir './pippo/', errno: 17)

-- now from another console I delete the "test" file, without closing this connection
-- and just retry. Now it works.

mysql> DROP DATABASE pippo;
Query OK, 0 rows affected (0.00 sec)

Di chuyển (các) tệp ra bên ngoài (hoặc xóa nếu không cần thiết) và thử lại. Ngoài ra, hãy xác định lý do tại sao chúng được tạo ngay từ đầu - nó có thể chỉ ra lỗi trong một số ứng dụng . Hoặc tệ hơn:xem bên dưới ...

CẬP NHẬT:Lỗi 17 dưới dạng cờ khai thác

Điều này đã xảy ra trên hệ thống Linux có cài đặt Wordpress. Thật không may, khách hàng bị hạn chế về thời gian và tôi không thể hình ảnh đĩa hoặc thực hiện một vòng pháp y thực sự - Tôi đã cài đặt lại toàn bộ máy và Wordpress đã được cập nhật trong quá trình này, vì vậy tôi chỉ có thể nói rằng tôi gần như em.> chắc chắn họ đã làm điều đó thông qua plugin này .

Triệu chứng :the mysql thư mục dữ liệu chứa ba tệp có phần mở rộng là PHP. Chờ đã, cái gì?!? - và bên trong các tệp có một lượng lớn mã base64 được chuyển đến base64_decode , gzuncompress[eval()][2] . Aha . Tất nhiên đây chỉ là những nỗ lực đầu tiên, không thành công. Trang web đã hoạt động tốt và thực sự là pwn3d.

Vì vậy, nếu bạn tìm thấy một tệp trong kho dữ liệu mysql của mình gây ra Lỗi 17, hãy kiểm tra nó bằng tệp file tiện ích hoặc quét nó bằng phần mềm chống vi-rút. Hoặc kiểm tra trực quan nội dung của nó. Đừng cho rằng nó ở đó vì một số nhầm lẫn vô hại.

(Không cần phải nói, để kiểm tra trực quan tệp, không bao giờ nhấp đúp vào tệp ).

Nạn nhân trong trường hợp này (anh ta có một số người bạn "thực hiện bảo trì") sẽ không bao giờ đoán được mình đã bị tấn công cho đến khi bảo trì / cập nhật / bất kỳ tập lệnh nào chạy DROP DATABASE ( Đừng hỏi tôi tại sao - Tôi không chắc ngay cả khi tôi muốn biết ) và gặp lỗi. Từ tải CPU và các thông báo nhật ký hệ thống, tôi khá khẳng định rằng máy chủ lưu trữ đã trở thành một trang trại thư rác.

Tuy nhiên, một lỗi khác 17

Nếu bạn rsync hoặc sao chép giữa hai bản cài đặt MySQL của cùng một phiên bản nhưng nền tảng hoặc hệ thống tệp khác nhau chẳng hạn như Linux hoặc Windows (không được khuyến khích và rủi ro, nhưng nhiều người vẫn làm) và đặc biệt với phân biệt chữ hoa chữ thường cài đặt, bạn có thể vô tình kết thúc với hai phiên bản của cùng một tệp (dữ liệu, chỉ mục hoặc siêu dữ liệu); nói Customers.myiCustomer.MYI . MySQL sử dụng một trong số chúng và không biết gì về cái còn lại (có thể đã lỗi thời và dẫn đến đồng bộ thảm hại). Khi rớt cơ sở dữ liệu, điều này cũng xảy ra trong nhiều mysqldump ... | ... mysql các chương trình dự phòng, DROP sẽ không thành công vì tệp bổ sung đó (hoặc những tệp bổ sung) tồn tại. Nếu điều này xảy ra, bạn sẽ có thể nhận ra (các) tệp lỗi thời cần xóa thủ công từ thời điểm tệp hoặc thực tế là sơ đồ trường hợp của chúng khác với phần lớn các bảng khác.

Tìm data-dir

Nói chung, bạn có thể tìm thấy thư mục dữ liệu bằng cách kiểm tra my.cnf tệp (/etc/my.cnf , /etc/sysconfig/my.cnf , /etc/mysql/my.cnf trên Linux; my.ini trong thư mục tệp chương trình MySQL trong Windows), trong [mysqld] tiêu đề, dưới dạng datadir .

Ngoài ra, bạn có thể hỏi chính MySQL:

mysql> SHOW VARIABLES WHERE Variable_name LIKE '%datadir%';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jar trong thư viện bên ngoài nhưng không thể nhập trong mã

  2. Nhận mySQL MONTH () để sử dụng các số 0 ở đầu?

  3. Lỗi laravel classloader.php không thể mở luồng:Không có tệp hoặc thư mục nào như vậy

  4. Sắp xếp có điều kiện trong MySQL?

  5. Tìm kiếm với giá trị được phân tách bằng dấu phẩy mysql