a) Nguyên tắc chung
Máy trạm (thông qua các trình duyệt Web) tạo ra một yêu cầu (request) dựa trên giao thức HTTP. Trình chủ Web nhận các yêu cầu này và chuyển cho servlet. Các servlets được nạp và được thực thi tại trình chủ Web (Web Server). Nếu servlet chưa được nạp, trình chủ Web sẽ nạp nó vào trong máy ảo Java và thực thi nó.
Các servlet sẽ thực hiện kết nối với cơ sở dữ liệu thông qua cơ chế JDBC. Sau đó, nó sẽ tiến hành thực hiện các công việc sao lưu hoặc khôi phục dữ liệu. Sau khi thực hiện xong Servlet sẽ trả ngược về cho trình chủ Web kết quả thực hiện công việc bằng một phản hồi (response). Trình chủ Web sẽ chuyển phản hồi này cho trình khách.
b) Các tiến trình thực hiện trong chương trình
+ Tiến trình kết nối vào cơ sở dữ liệu
Tiến trình thực hiện công việc thiết lập kết nối vào cơ sở dữ liệu (Postgresql, MySql…) bằng ngôn ngữ java thông qua cơ chế JDBC. Đối với mỗi loại cơ sở dữ liệu sẽ có hàm thư viện kết nối riêng.
+ Sao lưu cơ sở dữ liệu
Tiến trình này thực hiện sau khi tiến trình kết nối vào cơ sở dữ liệu thành công. Tiến trình thực hiện việc lấy cấu trúc của các thành phần trong cơ sở dữ liệu (bảng, các hàm, ...) sau đó ghi cấu trúc đó ra một tệp văn bản với tên “config.txt”.
Tiếp theo tiến trình sẽ ghi dữ liệu của các thành phần trong cơ sở dữ liệu ra một tệp văn bản. Mỗi đối tượng tương ứng với một tệp có tên tệp chính là tên đối tượng, và quá trình sao lưu kết thúc.
+ Khôi phục cơ sở dữ liệu
Tiến trình thực hiện việc tạo cấu trúc của cơ sở dữ liệu dựa vào tệp “config.txt”. Đầu tiên, thực hiện việc tạo 1 bảng trong cơ sở dữ liệu, bảng này có tên là config với 2 trường đó là tablename và name (trường tablename chứa câu lệnh tạo cấu trúc của các bảng, view, agent; trường name chứa tên của các đối tượng như table, view, agent…). Sau đó sẽ điền nội dung trong tệp config.txt tương ứng vào các trường này. Từ bảng config sẽ tiến hành tạo cấu trúc của các đối tượng trong cơ sở dữ liệu.
Sau khi đã tạo cấu trúc của các đối tượng trong cơ sở dữ liệu, chương trình sẽ tiến hành đọc các file text có tên trùng tên của các đối tượng trong cơ sở dữ liệu và điền dữ liệu tương trong các tệp văn bản vào các đối tượng trong cơ sở dữ liệu.
+ Sao lưu tự động
Cơ chế sao lưu tự động dựa vào tính năng của hệ điều hành. Trên hệ điều hành Linux sử dụng cơ chế “cron” còn trên hệ điều hành Windows sử dụng cơ chế Scheduled Tasks để thực hiện sao lưu theo thời gian định trước.
3.3 Kết quả thử nghiệm hệ thống
3.3.1 Môi trƣờng thử nghiệm
a) Thiết bị
Máy chủ: HP ML 380, 1Gb Ram
Hệ điều hành: RedHat Enterprise; Cở sở dữ liệu: Posgresql 8.0 b) Chương trình, dữ liệu
Chương trình đã được thử nghiệm để sao lưu, khôi phục trên hai cơ sở dữ liệu của Văn phòng Trung ương Đảng, đó là cơ sở dữ liệu Hệ thông tin điều hành tác nghiệp EdocMan và Website của Văn phòng Trung ương.
Thử nghiệm sao lưu cơ sở dữ liệu Hệ thông tin điều hành tác nghiệp EdocMan. Hệ thông tin điều hành tác nghiệp EdocMan quản lý công văn đi, đến của cơ quan, các thông tin tham khảo phục vụ lãnh đạo, chương trình công tác của cơ quan, các tài liệu văn kiện và mục lục hồ sơ lưu trữ. EDocMan gồm ba cơ sở dữ liệu trên Postgresql và cài đặt trên môi trường Linux đó là:
- Cơ sở dữ liệu DMS (Document Manament System) để quản các tài liệu do người dùng nhập vào. DMS có 64 bảng (table).
- Cơ sở dữ liệu UMS (User Manager System): Quản lý người dùng, nhóm người dùng, quyền truy cập tài nguyên. UMS có 6 bảng (table).
- Cơ sở dữ liệu WFS (Work Flow System) : Quản lý lưu trình làm việc trên mạng.WFS có 63 bảng (table).
3.3.2 Kết quả thử nghiệm
Cơ sở dữ liệu DMS có 64 bảng, 41 hàm, 1 view và bảng nhiều nhất chứa 467.564 bản ghi; Cơ sở dữ liệu UMS có 6 bảng, 4 hàm và bảng nhiều nhất là 350 bản ghi; Cơ sở dữ liệu WFS có 63 bảng, 4 hàm và bảng nhiều nhất là 10000 bản ghi.
Hình 16. Giao diện của chương trình sao lưu dữ liệu
Kết quả kiểm quá trình sao lưu như sau:
DMS UMS WFS
Thời gian sao lưu (Tính theo đơn vị giây)
25 3 5
Hình 18. Giao diện của chương trình khôi phục dữ liệu
Kết quả kiểm tra quá trình khôi phục
DMS UMS WFS
Thời gian sao lưu (Tính theo đơn vị giây)
30 5 7
3.3.3 Đánh giá
Chương trình sao lưu, khôi phục đảm bảo đúng mục tiêu và yêu cầu đề ra. Việc sao lưu, khôi phục đều đảm bảo chính xác và toàn vẹn dữ liệu. Về mặt hiệu suất hoạt động do việc ghi dữ liệu của mỗi đối tượng trong cơ sở dữ liệu lên một tệp nên tránh được tình trạng thời gian chờ (timeout) trong trình duyệt quá lâu khi dữ liệu lớn khi sao lưu hay khôi phục dữ liệu.
Chương trình có giao diện thân thiện với người sử dụng, việc sao lưu dữ liệu được thực hiện một cách tập trung có nghĩa là có thể sao lưu các cơ sở dữ liệu ở các máy chủ khác nhau. Tất cả các thao tác sao lưu, phục hồi đều thực hiện thông qua trình duyệt WebBrowser (Internet Exploser, Mozilla, …). Chương trình cũng đã được kiểm thử và chạy tốt trên cả hai môi trường là Windows và Linux do chương trình viết bằng ngôn ngữ java. Tuy nhiên chương trình cũng cần bổ sung thêm tính năng sao lưu gia tăng để đạt hiệu quả tối ưu trong công việc sao lưu, khôi phục các cơ sở dữ liệu.
KẾT LUẬN
Sao lưu, khôi phục dữ liệu hiện nay đang là vấn đề rất được quan tâm trong xã hội. Tại Việt Nam nói chung và tại Văn phòng Trung ương Đảng nói riêng, nhu cầu sao lưu khôi phục dữ liệu là rất lớn và vô cùng quan trọng. Việc có được một công cụ để quản trị việc sao lưu các cơ sở dữ liệu một cách tập trung là rất cần thiết.
Luận văn này nghiên cứu các nguyên tắc, phương thức và cách thức sao lưu các cơ sở dữ liệu; tìm hiểu cơ chế hoạt động của một số phần mềm sao lưu cơ sở dữ liệu trên thị trường hiện nay. Đa số các cơ sở dữ liệu đều hỗ trợ việc sao lưu, khôi phục dữ liệu tuy nhiên để sao lưu và khôi phục dữ liệu đòi hỏi người quản trị phải có kỹ năng nhất định về cơ sở dữ liệu. Một cơ sở dữ liệu cài trên các hệ điều hành khác nhau cũng có cách thức sao lưu, khôi phục khác nhau. Một số cơ sở dữ liệu đòi hỏi người quản trị phải ngồi tại máy chủ chứa cơ sở dữ liệu mới thực hiện được quá trình sao lưu, khôi phục.
Để khắc phục những khó khăn này thì cũng có rất nhiều phần mềm hỗ trợ việc sao lưu cơ sở dữ liệu của các hãng trên thế giới. Những phần mềm này đa số chỉ phục vụ cho việc sao lưu đặc thù một hệ quản trị cơ sở dữ liệu, như vậy với mỗi loại cơ sở dữ liệu đòi hỏi người sử dụng phải sử dụng rất nhiều phần mềm khác nhau. Mặt khác các phần mềm này đa số chỉ hoạt động trên môi trường Windows và chi phí để mua bản quyền các phần mềm này khá cao.
Việc xây dựng một phần mềm hoàn chỉnh với các tính năng ưu việt cho phép sao lưu tập trung các cơ sở dữ liệu là việc rất phức tạp, đòi hỏi rất nhiều công sức. Tuy nhiên, luận văn cũng mạnh dạn đưa ra giải pháp và xây dựng một công cụ thực hiện sao lưu, khôi phục dữ liệu của các cơ sở dữ liệu như Postgresql, MySQL…
Phần mềm này viết hoàn toàn trên mã nguồn mở, bằng ngôn ngữ Java và cho phép người sử dụng thông qua giao diện web rất thân thiện có thể sao lưu và khôi phục cơ sở dữ liệu một cách dễ dàng. Phần mềm có thể chạy trên mọi hệ điều hành (Windows, Linux…) có hỗ trợ máy ảo Java.
Việc xây dựng phần mềm này đòi hỏi phải có kiến thức về cấu trúc các cơ sở dữ liệu, cơ chế hoạt động, các kỹ năng về lập trình Java và đặc biệt đưa phương án, cơ chế tiến hành sao lưu khôi phục dữ liệu.
Tóm lại, phần mềm là một công cụ giúp cho người quản trị một cơ quan có một công cụ để sao lưu, khôi phục dữ liệu một cách tập trung với một giao diện thân thiện với người dùng. Tuy nhiên, để đảm bảo hoạt đông liên tục dữ liệu của một cơ quan đòi hỏi phải có sự kết hợp của rất nhiều giải pháp như phần cứng, phần mềm, chính sách sao lưu, mức độ ưu tiên của từng ứng dụng … Do vậy, đây chỉ là một trong các giải pháp để giúp cơ quan đảm bảo tuyệt đối an toàn dữ liệu nhằm đem lại nhiều đóng góp cho xã hội. Đây không chỉ đơn thuần là việc hoàn thành luận văn thạc sỹ mà còn là dịp giúp tác giả có điều kiện đầu tư công sức nghiên cứu vào việc sao lưu khôi phục dữ liệu tại chính cơ quan mình nói riêng và tiến tới đề xuất áp dụng trong hệ thống các cơ quan Đảng, Nhà nước nói chung. Việc nghiên cứu đề tài này giúp tác giả sử dụng kiến thức thu nạp được của khoá học sau đại học, phục vụ trực tiếp vào chuyên môn của mình, đem lại lợi ích cho cơ quan mình thông qua phần mềm này.
Hướng phát triển tiếp tục của luận văn:
Phần mềm xây dựng đáp ứng được yêu cầu cơ bản của việc sao lưu, phục hồi các cơ sở dữ liệu dữ liệu thông qua giao diện web. Việc quản trị việc sao lưu được thực hiện một cách tập trung. Tuy nhiên, cần phát triển thêm
tính năng về sao lưu gia tăng và tạo giao diện thân thiện hơn nữa cho người dùng trong việc đặt chế độ sao lưu tự động theo một thời gian định trước.
TÀI LIỆU THAM KHẢO Tiếng Việt
1. Phan Đình Diệu [1999], Lý Thuyết Mật Mã và An Toàn Thông Tin. 2. Nguyễn Văn Vị [2004], Phân tích thiết kế Hệ thống thông tin.
3. Vũ Duy Lợi và Lê Trung Nghĩa [2006], Mô hình kiến trúc hệ thống công nghệ thông tin trong các cơ quan Đảng.
4. Nguyễn Kim Anh [2004],Nguyên lý của các hệ cơ sở dữ liệu.
5. Trần Tuấn Hưng, Tạp chí bưu chính viễn thông số 6/2007, Tạo bản sao dữ liệu.
6. Nguyễn Ngọc Tuấn - Hồng Phúc [2005], Phát triển cơ sở dữ liệu Java Oracle
7. Hoàng Ngọc Ân [1998], Lập trình Java thế nào, Nhà xuất bản thống kê.
8. Website, cộng đồng java Việt Nam, http://www.javavietnam.org.
Tiếng Anh
9. Beety Jo Armstead and Stephen Prahst [1995], Implementation of a Campuswide Distributed Mass Storage Service.
10. Luis-Felipe Cabrera, Ribert Ress and Wayne Hineman [1995], Applying Dabase Technology in the ADSM Mass Storage System.
11. Subhash Bhalla and Stuart E. Madnick [2003], Asyschronous Backup and Initialization of a Database Server for Replicated Database Systems. 12. Brett McLaughlin [2007], Building Java Enterprise Applications Vol 1.
13. Wei-Dong Zhu, Monti Abrahams, Doris Ming Ming Ngai, Sandi Pond, Hernán Schiavi, Ed Stonesifer and Vanessa Stonesifer [2005], Content Manager OnDemand Backup, Recovery and High Availability.
14. Lou Marco [2007], EJB & JSP - Java On The Edge, Unlimited Edition. 15. Cay S. Horstmann, Gary Cornell [2007], Core Java 2-Volume I
Fundamentals, 7th Edition.
16. Derek C.Ashmore [2004], J2EE Architects Handbook.
17. Elmasri and Navathe, P.[2001], “Fundamentals of database systems”. 18. QuickSpec HP, Corp [2004], HP StorageWork Enterprise Virtual Array
8000.
19. Rogers Cadenhead - Laura Lemay [2007], Teach Yourself Java6 in 21 Days.
20. Elmasri and Navathe, P.[2001], “Fundamentals of database systems”, International edition, Third edition.
21. Maurice Naftalin and Philip Wadler [2006], Java Generics and Collections.
PHỤ LỤC
A. Cài đặt và cách sử dụng chương trình:
* Cài đặt máy ảo java:
Bước1: Cài j2sdk (Sun Development Kit), chứa Java Compiler (javac) dùng dịch các chương trình Java thành byte-code chạy được trên máy ảo. Ðặt lại biến môi trường PATH đến thư mục con bin của thư mục j2sdk (chứa các tệp chạy được).
Bước 2: Cài J2re (Java Runtime Environment): chứa máy ảo Java dùng để thực hiện các mã byte-code.
Bước 3: Đặt biến môi trường CLASSPATH trỏ đến thư mục hiện hành như sau: set CLASSPATH=.
*Cài đặt Webserver(Tomcat)
Bước 1: Đặt biến môi trường JAVA_HOME trong thư mục cha j2sdk.
Bước2: Cài đặt Tomcat Server .
Bước 3: Thư mục con \webapps\root chứa các ứng dụng của Webserver.
* Cài đặt các modul chương trình:
Bước 1: Copy 4 file saoluu.class, khoiphuc.class, backup.htm, khoiphuc.htm vào thư mục \webapps\root trong Tomcat.
Bước 2: Khởi động lại Tomcat Server và chạy chương trình.
* Sử dụng chương trình:
- Mở một WebBrowser trên máy tính.
- Đánh đường dẫn http://địachỉwebserver:cổng webserver/backup.htm để thực hiện việc sao lưu
- Đánh đường dẫn http://địachỉwebserver:cổngwebserver/khoi phuc.htm để thực hiện việc khoi phục dữ liệu
Các thông tin cần cung cấp cho việc sao lưu dữ liệu bao gồm:
Type of database: Kiểu cơ sở dữ liệu, có 3 loại đó là MySql, Potgsql và MicroSoft SQL.
Ip Address: Địa chỉ máy chủ chứa cơ sở dữ liệu.
Database need to backup: Tên cơ sở dữ liệu cần sao lưu.
UserName : Tên user có quyền truy xuất cơ sở dữ liệu.
B) Mã nguồn chương trình:
* Mã nguồn chương trình sao lưu:
import java.sql.*;
import java.sql.Connection;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class saoluu extends HttpServlet
{
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
res.setContentType("text/html");
ServletOutputStream out = res.getOutputStream();
out.println("<html>");
out.println("<head><title>Welcome</title></head>");
out.println("<body>");
String[] Ip = req.getParameterValues("Ip");
if(Ip != null && Ip[0].length() > 0)
out.println("<tr></tr>"); out.println(Ip[0]); } else { out.println("<tr></tr>"); out.println("<h1>Ip is null</h1>"); out.println("</body></html>"); }
String[] Database = req.getParameterValues("Database");
if(Database != null && Database[0].length() > 0)
{ out.println("<tr></tr>"); out.println(Database[0]); } else { out.println("<tr></tr>"); out.println("<h1>Database is null</h1>"); out.println("</body></html>"); }
if(UserName != null && UserName[0].length() > 0) { out.println("<tr><td></td></tr>"); out.println(UserName[0]); } else { out.println("<tr><td></td></tr>"); out.println("<h1>UserName is null</h1>"); out.println("</body></html>"); }
String[] Password = req.getParameterValues("Password");
if(Password != null && Password[0] != null && Password[0].length() > 0) { out.println("<tr><td></td></tr>"); out.println(Password[0]); } else { out.println("<tr><td></td></tr>"); out.println("<h1>Password is null</h1>");
out.println("</body></html>");
}
String[] Path = req.getParameterValues("Path");
if(Path[0] != null && Path[0] != null && Path[0].length() > 0)
{ out.println("<tr><td></td></tr>"); out.println(Path[0]); } else { out.println("<tr><td></td></tr>"); out.println("<h1>Path[0] is null</h1>"); out.println("</body></html>"); }
//doan moi them
try
{
Connection conn = null;
String url="jdbc:postgresql://" + Ip[0]+ "/"+ Database[0];
conn = DriverManager.getConnection(url,UserName[0],Password[0]); Statement s = conn.createStatement(); Statement s1 = conn.createStatement(); Statement s2 = conn.createStatement(); Statement s3 = conn.createStatement(); Statement s4 = conn.createStatement(); Statement s5 = conn.createStatement(); Statement s6 = conn.createStatement();
out.println("Da ket noi thanh cong CSDL");
String t0,t1,t2,t3,t4,t5,chuoi;
chuoi="";
s5.executeQuery("select * from pg_tables where schemaname = 'public' and tablename ='config'");
ResultSet rs5 = s5.getResultSet(); while (rs5.next()) { s6.executeUpdate("DROP TABLE config"); }
//String str = "CREATE TABLE config( tablename text)";
//s1.executeUpdate("DROP TABLE config");
out.println("Da xoa xong");
s1.executeUpdate("CREATE TABLE config(tablename text,name text)");
out.println("Da tao xong");
s.executeQuery("select tablename from pg_tables where schemaname = 'public'");
ResultSet rs = s.getResultSet(); while (rs.next()) { t0 ="CREATE TABLE "; t1=""; t5=""; t4=""; t2 = rs.getString("tablename"); t3=""; out.println("COPY "+ t2 +" TO '"+ Path[0] +"/" + t2+"'"); s1.executeUpdate("COPY "+ t2 +" TO '"+ Path[0] +"/" + t2+"'");
//Doan moi them 13/06/2007
s2.executeQuery(" select column_name,
information_schema.columns where table_name = '" + t2 +"' order by ordinal_position"); ResultSet rs2 = s2.getResultSet(); while (rs2.next()) { t1 = rs2.getString("column_name") + " " + rs2.getString("data_type"); t4= rs2.getString("character_maximum_length"); if (t4 == null) t1= t1+","; else t1= t1+"("+t4+"),"; t5= t5 + t1; } // out.println(t5); s3.executeQuery("select constraint_name, table_name,column_name from
information_schema.key_column_usage where table_name = '"+ t2+"'");
ResultSet rs3 = s3.getResultSet();
{
t3 = "CONSTRAINT " + rs3.getString("constraint_name")+" PRIMARY KEY ("+ rs3.getString("column_name"); } if (t3 !="") chuoi = t0 + t2+" (" + t5+ t3 +"))"; else chuoi = t0+t2+" (" + t5.substring(0,(t5.length()-1)) + ")"; out.println(chuoi);
String tr = "INSERT INTO config VALUES ('" + chuoi + "' , '"+ rs.getString("tablename")+"')";
//String tr = "INSERT INTO config VALUES ('" + chuoi + "')";
out.println(tr);
s4.executeUpdate(tr);
//Ket thuc doan moi them
}
rs.close();
s.close();
out.print("Success");
catch (Exception e)
{
out.print("Loi ket noi");
}
//ket thuc doan moi them
}
public String getServletInfo()
{
return "Welcome Servlet";
}
}
* Mã nguồn chương trình khôi phục dữ liệu:
import java.sql.*;
import java.sql.Connection; import java.io.*;
import javax.servlet.*; import javax.servlet.http.*;
public class restore extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
{
res.setContentType("text/html");
out.println("<html>");
out.println("<head><title>Welcome</title></head>"); out.println("<body>");
String[] Ip = req.getParameterValues("Ip"); if(Ip != null && Ip[0].length() > 0)
{