Hi Guys,
I know, the first question is “why” as a lot of tools, both free and commercial, are available to do the same thing. It’s fun 🙂 and may be it can give you general idea how those tools actually work internally.
Four main implementations:
1. Taking MySql database backup in .sql file
2. Putting .sql file in folder
3. Creating archive of this folder.
4. And finally copying archive file to a particular location.
So, let’s see the code.
Configurations:
DB_HOST_BK = localhost DB_USER_BK = username DB_PASS_BK = password DB_NAME_BK = databasename /* name of the database to backed up */ DB_PORT_BK = 3306 DESTI_FOLDER_NAME = /destination/path/for/folder DB_EXE_PATH = /usr/bin/mysqldump DESTI_ZIP_PATH = /destination/path/for/archive
Take MySql backup:
package com.mysql.backup; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.FileOutputStream; import java.io.File; import java.util.Date; import java.text.DateFormat; import java.text.SimpleDateFormat; /** * Takes backup of database * * @author Nitesh Apte * @version 1.0 * @license GPL */ public class DatabaseBackup { private int STREAM_BUFFER = 512000; public boolean backupDatabase(String host, String port, String user, String password, String dbname, String rootpath, String dbexepath) { boolean success = false; try{ String dump = getServerDumpData(host, port, user, password, dbname, dbexepath); if(!dump.isEmpty()) { byte[] data = dump.getBytes(); File file = new File(rootpath + "/" + dbname); if(!file.isDirectory()) { file.mkdir(); } DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHms"); Date date = new Date(); String filepath = rootpath + dbname + "/" + dbname + dateFormat.format(date) + ".sql"; File filedst = new File(filepath); FileOutputStream dest = new FileOutputStream(filedst); dest.write(data); dest.close(); success = true; } } catch (Exception ex) { ex.printStackTrace(); } return success; } public String getServerDumpData(String host, String port, String user, String password, String db, String mysqlpath) { StringBuilder dumpdata = new StringBuilder(); String execline = mysqlpath; try { if(host!=null && user!=null && password!=null && db!=null) { String command[] = new String[]{execline, "--host=" + host, "--port=" + port, "--user=" + user, "--password=" + password, "--compact", "--complete-insert", "--extended-insert", "--skip-comments", "--skip-triggers", db}; ProcessBuilder pb = new ProcessBuilder(command); Process process = pb.start(); InputStream in = process.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in)); int count; char[] cbuf = new char[STREAM_BUFFER]; while ((count = br.read(cbuf, 0, STREAM_BUFFER)) != -1){ dumpdata.append(cbuf, 0, count); } br.close(); in.close(); } } catch (Exception ex) { ex.printStackTrace(); return ""; } return dumpdata.toString(); } }
Folder related activities:
package com.mysql.backup; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * Create zip of folder * * @author Nitesh Apte * @version 1.0 * @license GPL */ public class FolderBackup{ public Boolean zipFolder(String srcFolder, String destZipFile) throws Exception { ZipOutputStream zip = null; FileOutputStream fileWriter = null; fileWriter = new FileOutputStream(destZipFile); zip = new ZipOutputStream(fileWriter); addFolderToZip(srcFolder, zip); zip.flush(); zip.close(); return true; } public void addFileToZip(String srcFile, ZipOutputStream zip) throws Exception { File folder = new File(srcFile); if (folder.isDirectory()) { addFolderToZip(srcFile, zip); } else { byte[] buf = new byte[1024]; int len; FileInputStream in = new FileInputStream(srcFile); zip.putNextEntry(new ZipEntry("/" + folder.getName())); while ((len = in.read(buf)) > 0) { zip.write(buf, 0, len); } } } public void addFolderToZip(String srcFolder, ZipOutputStream zip) throws Exception { File folder = new File(srcFolder); for (String fileName : folder.list()) { addFileToZip(srcFolder + "/" + fileName, zip); } } }
Now, the management:
package com.mysql.backup; import java.io.IOException; import java.math.BigInteger; import java.util.Date; import java.util.Properties; import java.text.DateFormat; import java.text.SimpleDateFormat; /** * Datavault Manager * * @author Nitesh Apte * @version 1.0 * @license GPL */ public class BackUpManager { public String DB_HOST; public String DB_NAME; public String DB_PORT; public String DB_USER; public String DB_PASS; public String FOLDER_NAME; public String DB_EXE; public String DESTINATION; public BigInteger timeNoted; String projectName = new String(); private static final String PROP_FILE = "config.properties"; public BackUpManager() { readConfiguration(); } public void readConfiguration() { try { Properties prop = new Properties(); prop.load(this.getClass().getResourceAsStream(PROP_FILE)); DB_HOST = prop.getProperty("DB_HOST_BK"); DB_NAME = prop.getProperty("DB_NAME_BK"); DB_PORT = prop.getProperty("DB_PORT_BK"); DB_USER = prop.getProperty("DB_USER_BK"); DB_PASS = prop.getProperty("DB_PASS_BK"); FOLDER_NAME = prop.getProperty("DESTI_FOLDER_NAME"); DB_EXE = prop.getProperty("DB_EXE_PATH"); DESTINATION = prop.getProperty("DESTI_ZIP_PATH"); } catch (IOException e) { System.out.println("Cannot read the property file."); } } public Boolean databaseBackup() { if(new DatabaseBackup().backupDatabase(DB_HOST, DB_PORT, DB_USER, DB_PASS, DB_NAME, FOLDER_NAME, DB_EXE)) { return true; } else { return false; } } public Boolean folderBackup() throws Exception { if(new FolderBackup().zipFolder(FOLDER_NAME + "/" + DB_NAME , DESTINATION + "/" + DB_NAME + ".zip")) { DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHms"); Date nowtime = new Date(); timeNoted = BigInteger.valueOf(Long.parseLong(dateFormat.format(nowtime))); return true; } else { return false; } } public static void main(String[] args) { BackUpManager dm = new BackUpManager(); try { if(dm.databaseBackup()) { if(dm.folderBackup()) { System.out.println("Process complete."); } else { System.out.println("Folder backup process failed."); } } else { System.out.println("Process failed."); } } catch (Exception e) { e.printStackTrace(); } } }
Keep the MySql connector jar in classpath 🙂
Soon, I will create a repository in Github.
That’s it guys.
Critics/suggestions are very much welcome.
Have a nice day ahead!
Nice one!
Thanks Anonymous 😀
Thanks Nitesh, a very good article !