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ặcrcmysqld stop
hoặc tương tự trên Linux,NET STOP <name of MYSQL service, often MYSQL57 or similar>
hoặc thông quaSERVICES.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
và [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.myi
và Customer.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)