Tôi lại quay lại với các bạn trong một bài viết liên quan đến cơ sở dữ liệu. Lần này chúng ta sẽ giải quyết một bài toán khác cũng mang ý nghĩa sống còn chẳng khác nào việc lưu trữ(backup) và phục hồi(restore) cơ sở dữ liệu nhưng ở phạm vi nhỏ hơn: cơ sở dữ liệu diễn đàn vBulletin và cụ thể hơn là thông tin của một thành viên nào đó.
Phụ mục
Tình huống
Trong một ngày đẹp trời nào đó, bỗng nhiên bạn nhận được khiếu nại của thành viên về việc bỗng nhiên toàn bộ bài viết của thành viên (vài trăm bài) biến mất còn tài khoản bị khóa (BAN). Bạn giật mình nhận ra dường như bạn đã tiến hành một hình phạt… nhầm user và hậu quả là member của bạn phải gánh chịu khá nặng nề.
Bạn không thể restore toàn bộ diễn đàn lại thời điểm trước khi nick này bị BAN bởi có rất nhiều bài viết đã được tạo ra sao đó và không thể vì một người mà làm ảnh hưởng đến đại đa số những người còn lại trong cộng đồng.
Bạn cũng không thể “làm ngơ” trước công sức đóng góp khá lớn của member mới có được một lượng bài viết như vậy. Đó là chưa nói những thiệt hại về mặt uy tín có thể đến với diễn đàn nếu như bạn không thể phục hồi và giải quyết ổn thỏa với con giận của thành viên đó.
Công cụ
Để phục hồi tài khoản, việc đầu tiên là bạn cần có những thứ quan trọng sau:
- Database backup mới nhất có bao gồm các bài viết của thành viên đó.
- Một cơ sở dữ liệu dự phòng, có thể cài đặt trên máy tính cá nhân để tiện thao tác bằng AppServ cũng được.
- Công cụ chia nhỏ và phục hồi dữ liệu mà tôi đã có dịp liệt kê ở bài trước
- phpMyAdmin để có thể thực thi các câu lệnh SQL
Việc tôi cần là bấy nhiêu đó. Nếu bạn cần thêm công cụ gì thì bạn có thể bổ sung cho công việc của bạn. Tuy nhiên những công cụ này căn bản là đầy đủ cho quá trình trích xuất dữ liệu và phục hồi.
Trích xuất dữ liệu
Trước tiên,bạn cần phải khôi phục dữ liệu của mình bằng các sử dụng bản backup để phục hồi dữ liệu gần nhất của thành viên vào mộ database tạm thời trên localhost. Trong trường hợp database của bạn có khối lượng tương đối lớn, bạn cần thiết phải sử dụng những công cụ chia nhỏ dữ liệu để có thể làm việc với chúng dễ dàng hơn.
Sau khi khôi phục dữ liệu chúng ta sẽ có một database hoàn chỉnh bao gồm dữ liệu của tất cả các thành viên trong đó có thành viên đã bị xóa bài. Tiếp theo, chúng ta cần lấy những bài viết mà trong database hiện tại đã bị xóa đi và trả về.
Bản thân vBulletin quản lý lượt đồ cơ sở dữ liệu qua khóa chính và khóa phụ, trong đó các thông tin của thành viên chủ yếu sử dụng khóa chính là userid và khóa phụ là username. Cho nên, để thuận tiện cho việc tìm kiếm thông tin bạn cần phải biết 2 thông tin này. Với username thì khá đơn giản vì nó là tên đăng nhập của thành viên và chắc chắn bạn sẽ biết. Chúng ta tiến hành tìm userid của thành viên bằng lệnh sau:
[code] SELECT `userid` FROM `user` WHERE `username`=’username_cua_thanh_vien’[/code]
Tiếp theo, chúng ta tiến hành trích xuất dữ liệu của thành viên này ra để từ đó restore qua database hiện tại của diễn đàn vBulletin.
Trước tiên chúng ta làm việc với table thread:
[code] SELECT * FROM `thread` WHERE `postuserid`=12345[/code]
Với 12345 ở đây là ID của user bạn cần phục hồi dữ liệu. Chúng ta sẽ nhận được một bản dữ nhiệu bao gồm tất cả các thread được user có ID = 12345 được tạo ra. Giờ chúng ta tiến hành download dữ liệu này về để khôi phục.
Xuất dữ liệu ra để download bằng cách click vào ExportBạn tiến hành cấu hình lại một chút file sẽ download: do chúng ta đã có cơ sở dữ liệu sẵn và chỉ cần dữ liệu của thành viên nên chúng ta sẽ bỏ đi phần cấu trúc table và lưu lại dạng nén GZIP để giúp quá trình restore dễ dàng hơn.
Cấu hình Export dữ liệu MySQLTiếp theo khi download về bạn sẽ nhận được một file với tên là tên table như thế này.
Download dữ liệu về máy tínhNhư vậy là bạn đã có dữ liệu về các thread đã được thành viên tạo ra. Tuy nhiên, dữ liệu này chỉ là các chủ đề, không bao gồm nội dung và các bình luận. Để lấy được các bình luận chúng ta sẽ tiến hành đến table post và thực hiện việc lấy thông tin.
[code]SELECT postid FROM `post` WHERE `userid`=12345[/code]Qua kiểm tra truy vấn này, tôi có thể biết được thành viên này hiện có bao nhiêu bài viết trên diễn đàn tương ứng với bao nhiêu bài viết đã bị xóa. Tuy nhiên, chúng ta cũng cần để ý rằng một thread do thành viên bị xóa mở ra có thể sẽ bao gồm nhiều bài viết của các thành viên khác, khi thread bị xóa thì bài viết của các thành viên khác cũng bị xóa theo. Do đó, khi phục hồi post của thành viên này, cũng phải phục hồi luôn các post của các thành viên khác do thành viên này mở thread. Như vậy, số post cần phục hồi sẽ cao hơn số lượng bài viết của thành viên này.
Tôi sẽ lấy tất cả các post thuộc tất cả các thread do thành viên này mở ra, bao gồm cả bài viết của các thành viên khác trong thread do thành viên này mở. Đoạn lệnh SQL như sau:
[code]SELECT * FROM `post` WHERE `threadid` IN (SELECT threadid FROM thread WHERE postuserid=’30714′)[/code]Câu truy vấn lồng này sẽ lấy được tất cả các bài viết nằm trong thread do thành viên bị xóa bài mở ra. Bạn tiếp tục Export phần dữ liệu này ra để phục hồi.
Chưa dừng lại ở đó, bạn cũng sẽ nhận ra rằng thành viên này chẳng những mở thread cho các thành viên khác viết bài, anh ta còn tham gia vào các thread của các thành viên khác. Do đó, bạn cần phải phục hồi cả những bài viết được anh ta viết ở các thread khác. Rất đơn giản, chúng ta dùng phương pháp loại trừ các thread anh ta đã mở ra sẽ có được những bài viết được viết ở các topic khác:
[code]SELECT * FROM `post` WHERE `threadid` NOT IN (SELECT threadid FROM thread WHERE postuserid=’30714′)[/code]Tiếp tục xuất dữ liệu này ra để phục hồi cho thành viên.
Những phần còn lại cũng không thực sự quan trọng nhưng cũng rất đáng để bạn xem qua và lưu tâm đến những thông tin của thành viên như các table attachment, attachmentcategory, attachmentcategoryuser, blog… nếu có. Về căn bản, bạn sẽ cần mở từng table ra và kiểm tra những thông tin trùng khớp với userid của thành viên xem có cần phải trích xuất ra hay không. Nếu cần hãy trích xuất ra để phục hồi.
Sau khi đã có đầy đủ dữ liệu, bạn tiến hành phục hồi dữ liệu cho thành viên bằng cách chạy các file SQL mà chúng ta đã trích xuất ra từ nãy giờ.
Hoàn thành
Sau khi backup dữ liệu mới, bạn cần xóa các cache cũ như cache tìm kiếm, cho chạy lại phần post counter trong admin để đồng bộ lại số bài viết của thành viên…Tóm lại là bạn cần thực hiện quá trình đồng bộ dữ liệu từ AdminCP của vBulletin.
Cuối cùng là ngồi tận hưởng thành quả :)
Van Thanh says
Dạo này hay vào blog của bác Nhân hoc hỏi được rất nhiều.
Cảm ơn bác đã chia sẻ!