Alfresco勉強会#18 alfrescoのバックアップとリストア
- 4. はじめに
本資料の内容はAlfrescoCommunity 4.2.dに基づいています
◦ データベースはPostgreSQLを利用(インストーラ標準)
◦ 全文検索エンジンSolrを利用(インストーラ標準)
具体的な手順(コマンドとか)は色々はしょってたりもっと気
の利いた方法があったりしますが、最低限これでできますよ、
ということで…
インストール方法は以下の資料を参考にしてください
http://www.slideshare.net/TasukuOtani/alfresco15-alfresco-4
http://aegif-labo.blogspot.jp/2012/03/alfresco40.html
ここらへんの記事を参考にしています
http://wiki.alfresco.com/wiki/Backup_and_Restore
http://docs.alfresco.com/4.2/index.jsp?topic=%2Fcom.alfresco.enterprise.do
c%2Fconcepts%2Fch-backup-restore.html
http://docs.alfresco.com/4.2/index.jsp?topic=%2Fcom.alfresco.enterprise.do
c%2Fconcepts%2Fch-backup-restore.html
- 6. バックアップの種類
コールドバックアップ
◦ アプリケーションを停止してバックアップを取得する
◦ 整合性の取れたバックアップデータを安全に取得できる
◦ サービス提供時間等、サービス品質が落ちる(と判断される)可
能性がある
ホットバックアップ
◦ アプリケーションが稼働したままバックアップを取得する
◦ バックアップデータ自体の整合性が保証されない
◦ システム停止に伴うサービス品質低下が起こらない
※ もちろん、リストア時に整合性をとるための処理を行えば問題ありません(自動実行さ
れるものと、手動で実行する必要のあるものがあります)
- 7. コールドバックアップ
バックアップの方法
1. Alfrescoを停止する
2. 以下の3つのバックアップを取得する
◦ データベース : PostgreSQLのデータディレクトリ
<alf_dir>/alf_data/postgresql 以下全部
◦ ファイルシステム : contentstoreディレクトリ
<alf_dir>/alf_data/contentstore 以下全部
◦ 全文検索インデックス : solr/workspace, solr/archiveディレクトリ
<alf_dir>/alf_data/solr/workspace
<alf_dir>/alf_data/solr/archive
以上!とても簡単!!
※ Luceneの場合は<alf_dir>/alf_data/lucene-indexesディレクトリをバックアップします
※ データバックアップの他に、システムバックアップ(導入直後のVMスナップショットや
ハードディスクイメージ等)を取っておくと復旧が早いです
- 8. コールドバックアップ
リストアの方法
1. (必要に応じて)Alfresco/PostgreSQLを再セットアップする
2. バックアップデータを以下のディレクトリにコピーする
◦ データベース : PostgreSQLバックアップデータ
<alf_dir>/alf_data/postgresql
◦ ファイルシステム : contentstoreバックアップデータ
<alf_dir>/alf_data/contentstore
◦ 全文検索インデックス : Solrインデックスバックアップデータ
<alf_dir>/alf_data/solr/workspace
<alf_dir>/alf_data/solr/archive
PostgreSQL, Alfrescoを起動する
以上!とっても簡単!!
※ コピー先にファイルが存在する場合は、コピー前に削除もしくは移動しておきます
※ Luceneの場合はバックアップデータを<alf_dir>/alf_data/lucene-indexesに戻します
※ Alfresco起動ユーザとバックアップ実行ユーザが異なる場合はファイルのownerに注意!
- 9. ホットバックアップ
ホットバックアップのポイント
3つのバックアップ対象のバックアップ順序がとても重要
1. 全文検索インデックス
2. データベース
3. ファイルシステム
全文検索インデックスはAlfrescoが定期的に(日次で)生成
するバックアップを使う
◦ 全文検索インデックス(=ただのファイル)をAlfresco起動中にコ
ピーすると、壊れたバックアップデータとなる
◦ バックアップ生成時刻はsolr/workspaceが2AM、solr/archiveが4AM
※ Luceneの場合のバックアップは3AMに生成されます
※ 時刻の変更はsolr.backup.alfresco.cronExpression, solr.backup.archive.cronExpression (Solr)、
index.backup.cronExpression (Lucene)をalfresco-global.propertiesで設定します
- 10. ホットバックアップ
バックアップの方法
1. 全文検索インデックスのバックアップを取得する
◦ <alf_dir>/alf_data/solrBackup 以下全部をコピーする
2. データベースのホットバックアップを取得する
◦ [事前準備] バックアップ実行ユーザのホームディレクトリ
に.pgpassファイルを作成しておく(chmod 0600 .pgpass)
◦ 以下のコマンドを実行してPostgreSQLのホットバックアップを
取得する(.pgpassでパスワード入力を省略できる)
3. ファイルシステムのバックアップを取得する
◦ <alf_dir>/alf_data/contentstore 以下全部をコピーする
※ .pgpassの中身は<hostname>:<port>:<dbname>:<user>:<password>
※ RDBMSの種類や構成に合わせて適宜ホットバックアップを実施してください
※ Luceneの場合は<alf_dir>/alf_data/backup-lucene-indexesをバックアップします
# /opt/alfresco-4.2.d/postgresql/bin/pg_dump -U alfresco -w --format=plain alfresco > /backup/pgdump.sql
localhost:5432:alfresco:alfresco:admin
- 12. ホットバックアップ
リストアの方法(2)
3. PostgreSQLを起動する
4. データベースを復元する
◦ 以下のコマンドを実行してテーブルを作成する
◦ バックアップスクリプトを流す
5. Alfrescoを起動する
※ RDBMSの種類や構成に合わせて適宜リストアを実施してください
※ Luceneの場合はバックアップデータを<alf_dir>/alf_data/lucene-indexesにコピーし、
alfresco-global.propertiesでindex.recovery.mode=AUTOと設定してAlfrescoを起動します。イ
ンデックスリカバリが走るので、無事に終わったら設定を元に戻しておきます
# /opt/alfresco-4.2.d/postgresql/bin/psql
postgres=#CREATE ROLE alfresco PASSWORD'admin' LOGIN NOSUPERUSERINHERIT NOCREATEDB
NOCREATEROLE;
postgres=#CREATE DATABASEalfrescoWITH OWNER = alfresco ENCODING = 'UTF8'TEMPLATE =
template0TABLESPACE= pg_default LC_COLLATE = 'ja_JP.UTF-8' LC_CTYPE = 'ja_JP.UTF-8'CONNECTION
LIMIT = -1;
postgres=# ¥c alfresco alfresco
postgres=# ¥i /backup/pgdump.sql
- 14. (おまけ)
Alfrescoが吹っ飛んだ時のデータ救出
データベースとファイルシステムのバックアップデータからAlfresco内に登録されてい
たファイルを救出する
◦ ファイル実体はバイナリとしてはそのままだがファイル名が変わっている(e.g. 0f6f21e8-937b-
40fc-9efd-832d835634fc.bin)
◦ データベースで管理されている情報と突合し、元ファイル名を知る必要がある
答え
1. 同バージョンのAlfrescoを別途インストールし、バックアップデータからリストアす
る(基本的にはこちらを推奨)
2. 以下のクエリを投げ、元ファイル名と現ファイルパスの一覧を出力する(もうちょっ
と賢いクエリあるかも…)
SELECT docid.string_value, url.content_urlFROM alf_node_propertiesnp
INNER JOIN alf_content_dataacd on np.long_value = acd.id
INNER JOIN alf_content_urlurl on acd.content_url_id= url.id
INNER JOIN alf_node_propertiesdocid on docid.node_id = np.node_id
INNER JOIN alf_qnameaqn on docid.qname_id= aqn.id
WHERE aqn.local_name= "name" and aqn.ns_id= 6
商品1.jpg store://2013/9/24/11/10/2d0bd698-2846-40d7-aa08-db4e62b09d66.bin
商品4.jpg store://2013/9/24/11/10/36fd9b2f-0744-4767-804b-83fd97716fde.bin
商品5.jpg store://2013/9/24/11/10/60f7fe0a-36a8-46e5-ba82-bdc112f94366.bin
商品2.jpg store://2013/9/24/11/10/685484d9-3dba-4178-aa08-1dc7e926c3c4.bin