Symfoware

Symfowareについての考察blog

Apache Derbyのバックアップとリストア

Derbyのバックアップ、リストア方法について調べたのでメモ。

こちらを参考にしました。
Backing Up a Database



1.フォルダのコピー



1つ目の方法は、フォルダごとコピーしてしまうことのようです。

Apache DerbyをFreeBSD 10.1で起動し、別の端末からJDBCで接続する

こちらで動作を確認した時、data/sampleというフォルダが
作成されているので、これをコピーし、接続を試してみます。

data/sampleをコピーし、data/sample_copyを作成しました。
プログラムを変更して検索してみます。


  1. package sample;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.Statement;
  6. public class MainProcess {
  7.     
  8.     public static void main(String... args) {
  9.         Connection con;
  10.         
  11.         
  12.         try {
  13.             con = DriverManager.getConnection("jdbc:derby://192.168.1.103:1527/data/sample_copy;create=true");
  14.             
  15.             con.setAutoCommit(false);
  16.             
  17.             Statement st = con.createStatement();
  18.             
  19.             ResultSet rs = st.executeQuery("select * from t1");
  20.             while(rs.next()) {
  21.                 System.out.println("id=" + rs.getInt("id") + ", " + "name=" + rs.getString("name"));
  22.             }
  23.             
  24.             
  25.             rs.close();
  26.             st.close();
  27.             
  28.             con.commit();
  29.             con.close();
  30.             
  31.         } catch(Exception e) {
  32.             e.printStackTrace();
  33.         }
  34.         
  35.         System.out.println("connection ok");
  36.     }
  37.     
  38. }




id=1, name=日本語登録テスト
connection ok




ちゃんとコピー前のデータが検索できていますね。
ただ、この方法はデータベースサーバーを一度停止したほうが良さそうです。





2.オンラインバックアップ



https://db.apache.org/derby/docs/10.0/manuals/admin/hubprnt43.html
https://db.apache.org/derby/docs/10.0/manuals/admin/hubprnt46.html

このあたりが参考になりそうです。
コマンドラインからも操作できるようですが、JDBCドライバ経由で
プログラムを書いて試してみました。

まず、バックアップ。
以下のストアドプロシージャ(?)を呼びだせばOK。


CALL SYSCS_UTIL.SYSCS_BACKUP_DATABASE('/usr/local/opt/derby/data/sample_backup')




プログラムにするとこんな感じになります。


  1. package sample;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.Statement;
  5. public class MainProcess {
  6.     
  7.     public static void main(String... args) {
  8.         Connection con;
  9.         
  10.         
  11.         try {
  12.             con = DriverManager.getConnection("jdbc:derby://192.168.1.103:1527/data/sample;create=true");
  13.             
  14.             con.setAutoCommit(false);
  15.             
  16.             // バックアップコマンドを実行
  17.             Statement st = con.createStatement();
  18.             st.execute("CALL SYSCS_UTIL.SYSCS_BACKUP_DATABASE('/usr/local/opt/derby/data/sample_backup')");
  19.             
  20.             st.close();
  21.             
  22.             con.commit();
  23.             con.close();
  24.             
  25.         } catch(Exception e) {
  26.             e.printStackTrace();
  27.         }
  28.         
  29.         System.out.println("connection ok");
  30.     }
  31.     
  32. }




これで指定フォルダにバックアップが作成されました。

リストアは、接続文字列でバックアップを指定します。
data/sample_recvに先ほど取得したバックアップを復元。


jdbc:derby://192.168.1.103:1527/data/sample;rollForwardRecoveryFrom=/usr/local/opt/derby/data/sample_backup




  1. package sample;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.Statement;
  6. public class MainProcess {
  7.     
  8.     public static void main(String... args) {
  9.         Connection con;
  10.         
  11.         
  12.         try {
  13.             // バックアップから復元
  14.             //con = DriverManager.getConnection("jdbc:derby://192.168.1.103:1527/data/sample;create=true");
  15.             con = DriverManager.getConnection("jdbc:derby://192.168.1.103:1527/data/sample_recv;rollForwardRecoveryFrom=/usr/local/opt/derby/data/sample_backup");
  16.             
  17.             con.setAutoCommit(false);
  18.             
  19.             // 復元できたか検索
  20.             Statement st = con.createStatement();
  21.             ResultSet rs = st.executeQuery("select * from t1");
  22.             while(rs.next()) {
  23.                 System.out.println("id=" + rs.getInt("id") + ", " + "name=" + rs.getString("name"));
  24.             }
  25.             
  26.             rs.close();
  27.             st.close();
  28.             
  29.             con.commit();
  30.             con.close();
  31.             
  32.         } catch(Exception e) {
  33.             e.printStackTrace();
  34.         }
  35.         
  36.         System.out.println("connection ok");
  37.     }
  38.     
  39. }




・・・と思ったのですが、復元時にエラーになりました。


java.sql.SQLNonTransientConnectionException: DERBY SQL error: ERRORCODE: 40000, SQLSTATE: XJ040, SQLERRMC: クラス・ローダーsun.misc.Launcher$AppClassLoader@6e0be858を使用してデータベース'data/sample_recv'を起動できません。詳細は次の例外を参照してください。::SQLSTATE: XBM0Q
    at org.apache.derby.client.am.SQLExceptionFactory.getSQLException(Unknown Source)
    at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source)
    at org.apache.derby.jdbc.ClientDriver.connect(Unknown Source)
    at java.sql.DriverManager.getConnection(DriverManager.java:571)
    at java.sql.DriverManager.getConnection(DriverManager.java:233)




これ、解決できなかったのですが、バックアップフォルダにある
データベースを指定して起動するとつながりました。


  1. package sample;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.Statement;
  6. public class MainProcess {
  7.     
  8.     public static void main(String... args) {
  9.         Connection con;
  10.         
  11.         
  12.         try {
  13.             // バックアップから復元
  14.             con = DriverManager.getConnection("jdbc:derby://192.168.1.103:1527/data/sample_backup/sample;create=true");
  15.             
  16.             con.setAutoCommit(false);
  17.             
  18.             // 復元できたか検索
  19.             Statement st = con.createStatement();
  20.             ResultSet rs = st.executeQuery("select * from t1");
  21.             while(rs.next()) {
  22.                 System.out.println("id=" + rs.getInt("id") + ", " + "name=" + rs.getString("name"));
  23.             }
  24.             
  25.             rs.close();
  26.             st.close();
  27.             
  28.             con.commit();
  29.             con.close();
  30.             
  31.         } catch(Exception e) {
  32.             e.printStackTrace();
  33.         }
  34.         
  35.         System.out.println("connection ok");
  36.     }
  37.     
  38. }



最悪、手動でファイルを元に戻せば復元できそうです。

関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/07/05(日) 15:13:43|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<FreeBSD 10.1でH2 Database Engineを起動する | ホーム | Apache DerbyをFreeBSD 10.1で起動し、別の端末からJDBCで接続する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1742-27527898
この記事にトラックバックする(FC2ブログユーザー)