Cũng có thể làm những gì bạn muốn bằng cách thao tác trực tiếp với cơ sở dữ liệu. Có các chi tiết có thể thay đổi một chút tùy thuộc vào tình huống của bạn, nhưng các bước cơ bản sẽ diễn ra như sau:
Đặt wiki của bạn ở chế độ chỉ đọc . Bạn không muốn ai đó thử chỉnh sửa wiki trong khi bạn đang làm rối cơ sở dữ liệu.
Tạo một bản sao lưu của wiki của bạn. (Điều này rất được khuyến khích trước khi xóa bất kỳ khối lượng không thể đảo ngược nào.)
Xóa tất cả tài khoản người dùng được tạo bởi những kẻ gửi thư rác. Nếu, như trong câu hỏi trên, bạn là người dùng hợp lệ duy nhất, bạn chỉ có thể làm:
DELETE FROM user WHERE user_id != YOUR_USER_ID;
Ngoài ra, nếu không có tài khoản hợp lệ mới nào được tạo sau khi những kẻ gửi thư rác phát hiện ra wiki, bạn có thể tìm số ID người dùng hợp lệ cao nhất và thực hiện:
DELETE FROM user WHERE user_id > LAST_VALID_USER_ID;
Hoặc bạn có thể sử dụng một công cụ quản trị như phpMyAdmin để chọn thủ công các tài khoản hợp lệ và xóa phần còn lại.
Làm sạch dữ liệu bổ sung liên quan đến các tài khoản bị xóa. Điều này không thực sự cần thiết, nhưng những hồ sơ mồ côi đó không được sử dụng và sẽ làm lộn xộn cơ sở dữ liệu của bạn nếu bạn không xóa chúng:
DELETE FROM user_groups WHERE ug_user NOT IN (SELECT user_id FROM user);
DELETE FROM user_properties WHERE up_user NOT IN (SELECT user_id FROM user);
DELETE FROM user_newtalk WHERE user_id NOT IN (SELECT user_id FROM user);
Xóa mọi sửa đổi không được thực hiện bởi người dùng hợp lệ:
Đây là bước tiến lớn; tất cả mọi thứ trước khi nó được chuẩn bị, mọi thứ sau khi nó được dọn dẹp. Với tất cả các tài khoản spam đã bị xóa, bạn chỉ cần làm:
DELETE FROM revision WHERE rev_user > 0 AND rev_user NOT IN (SELECT user_id FROM user);
Nếu wiki của bạn bị vô hiệu hóa chỉnh sửa ẩn danh (mà tôi đặc biệt khuyên dùng cho wiki riêng / kiểm tra), thì truy vấn trên đủ để loại bỏ tất cả các sửa đổi spam. Tuy nhiên, nếu bạn đã bật tính năng chỉnh sửa anon, bạn sẽ phải loại bỏ thư rác ẩn danh riêng biệt.
Nếu bạn chắc chắn rằng tất cả các chỉnh sửa anon trên wiki của bạn là spam, thì các chỉnh sửa duy nhất được thực hiện bởi UID 0 mà chúng tôi có thể cần giữ lại là các chỉnh sửa được thực hiện bởi chính MediaWiki (chẳng hạn như các trang được nhập từ bên ngoài wiki). Trong trường hợp đó, một cái gì đó giống như truy vấn sau sẽ hoạt động:
DELETE FROM revision WHERE rev_user = 0 AND rev_user_text BETWEEN '1' AND '999';
Điều này sẽ xóa mọi sửa đổi bởi UID 0 trong đó tên người dùng trông (mơ hồ) giống như một địa chỉ IPv4; nghĩa là, nó bắt đầu bằng một chữ số từ 1 đến 9.
Nếu wiki của bạn có một số chỉnh sửa anon hợp pháp thực tế, bạn có thể phải sáng tạo hơn một chút. Nếu số lượng địa chỉ IP được sử dụng bởi các biên tập viên chưa đăng ký hợp pháp bị hạn chế, bạn chỉ cần thêm một mệnh đề như AND rev_user_text NOT IN ('1.2.3.4', '5.6.7.8', '9.10.11.12')
vào truy vấn ở trên để loại trừ đóng góp của các IP đó khỏi bị xóa. Bạn cũng có thể thêm các điều kiện như, giả sử, AND rev_user_text NOT LIKE '192.168.%'
để lưu tất cả các chỉnh sửa từ địa chỉ IP bắt đầu bằng một tiền tố cụ thể.
Các truy vấn ở trên sẽ loại bỏ các sửa đổi spam (mặc dù nội dung của chúng sẽ vẫn còn trong text
bảng), nhưng sẽ để lại page_latest
trường của bất kỳ trang bị ảnh hưởng nào chỉ ra một sửa đổi không tồn tại. Điều này có thể gây nhầm lẫn, vì vậy chúng tôi nên sửa nó.
Đầu tiên, chúng ta cần xóa sạch page_latest
cột cho tất cả các trang:
UPDATE page SET page_latest = 0;
Tiếp theo, chúng tôi sẽ xây dựng lại cột, bằng cách chạy tập lệnh bảo trì AttachLatest.php (được khuyến nghị; hãy nhớ sử dụng --fix
tham số để tập lệnh thực sự thay đổi cơ sở dữ liệu) hoặc bằng truy vấn SQL thủ công:
UPDATE page SET page_latest =
(SELECT MAX(rev_id) FROM revision WHERE rev_page = page_id);
Cuối cùng, chúng tôi sẽ xóa tất cả các trang mà không có bản sửa đổi hợp lệ nào có thể được tìm thấy (vì chúng được tạo bởi những kẻ gửi thư rác và không bao giờ có bất kỳ nội dung hợp lệ nào):
DELETE FROM page WHERE page_latest = 0;
Đối với một liên lạc cuối cùng, xây dựng lại các liên kết, chỉ mục văn bản và bảng thay đổi gần đây bằng cách chạy rebuildall.php kịch bản bảo trì. Bạn cũng có thể muốn xóa nội dung của các bản sửa đổi thư rác đã bị xóa khỏi cơ sở dữ liệu để chúng không chiếm dung lượng không cần thiết ở đó, bằng cách chạy tập lệnh bảo trì purgeOldText.php .
Khi mọi thứ đã hoàn tất, hãy kiểm tra xem mọi thứ có ổn không, và nếu vậy, hãy tắt chế độ chỉ đọc - hy vọng sau khi cài đặt một số tính năng chống spam để tránh sự cố xảy ra.