На сегодняшний день разработчики Alfresco приводят в официальной документации два варианта создания резервных копий сервера альфреско. информация об этом написано здесь: http://docs.alfresco.com/5.0/concepts/backup-intro.html

Резервное копирование

Я приведу пример скрипта, который себя отлично зарекомендовал на серверах Ubuntu Linux и предназначен для создания резервной копии всех данных сервера Alfresco Community ECM.

Скрипт выполняет так называемое "холодное" копирование, которое, по своей сути, заключается в остановке сервера и архивировании всех файлов, за исключением журналов событий (логов) системы альфреско. Затем скрипт проверяет количество резервных копий, при необходимости, удаляет более старые версии архива.

Стоит обратить внимание, на то, что скрипт выполняет создание архивной резервной копии на том же сервере, без выполнения процедуры перемещения.
Я считаю, что скрипт должен выполнять только конкретную задачу, таким образом обеспечивается наибольшая стабильность и возможность распределения функций.

Ниже приведено само содержимое скрипта:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/bin/bash
# Backup of Alfresco
echo "############################" 
echo "#  script BackUp Alfresco  #" 
echo "############################" 
 
echo "Start script - $(date +%d.%m.%Y) ($(date +%H.%M:%S))"
 
# Configuration:
  TIMESTAMP=$( date +%Y%m%d%H%M%S )  # Создание временной метки
  DUMP_NUM=10						 # Число бэкапов
  AL_FOLDER="/opt/alfresco-5.0.d"	 # Расположение Alfresco
 
# Function - Stop Alfresco
al_stop()
{
  sudo service alfresco stop
 
  # Если Alfresco не останавливается, 
  # необходимо завершить работу скрипта, 
  # чтобы не повредить индексы данных !
  if [ "$?" != "0" ]; then
    echo "Alfresco Stop FAILED - STOP SCRIPT!"
    exit 1;
  fi
}
 
# Function - Start Alfresco
al_start()
{
  sudo service alfresco start
}
 
# Проверка наличия аргумента в командной строке
# запуска скрипта
if [ -d "$1" ]; then
  # Если указана папка, то сохранять в нее
  TARGET_FOLDER="$1"
else
  # Если не указана, то сохранять в папку по умолчанию
  TARGET_FOLDER="/opt/BackUps"
fi
 
#----------------------------------------
# 1 - Begin by stopping Alfresco
#----------------------------------------
 
  al_stop
  echo "SERVER STOP"
  echo "."
 
#----------------------------------------
# 2 - Deleting temps folders
#----------------------------------------  
 
echo "Deleting temps folder..."
 
sudo rm -r /opt/alfresco-5.0.d/tomcat/logs/*
sudo rm -r /opt/alfresco-5.0.d/tomcat/work/*
sudo rm -r /opt/alfresco-5.0.d/tomcat/temp/*
 
echo "Temps folder deleted."
 
#------------------------------------------
# 3 - Create backup
#------------------------------------------
 
echo "##################" 
echo "#  Start BackUp  #" 
echo "##################" 
echo "Start backup - $(date +%d.%m.%Y) ($(date +%H.%M:%S))"  
 
  # Создание резервной копии с временной меткой
  BACKUP_FILE="alfresco_back_${TIMESTAMP}.tar"
 
  sudo tar zcf $TARGET_FOLDER/$BACKUP_FILE $AL_FOLDER
 
  # Удаление дубликатов
  if [ -f "$TARGET_FOLDER/$BACKUP_FILE" ]; then
    echo "BACKUP SUCCESSFUL"    
    SUCCESS=1
  fi
 
echo "################"  
echo "#  BackUp end  #" 
echo "################" 
echo "End backup - $(date +%d.%m.%Y) ($(date +%H.%M:%S))"  
 
#------------------------------------------
# 4 - Start the Alfresco service
#------------------------------------------
 
  al_start
  echo "Alfresco service started."
  echo "Started Alfresco - $(date +%d.%m.%Y) ($(date +%H.%M:%S))"     
 
#------------------------------------------
# 5 - Remove backups older than DUMP_NUM days
#------------------------------------------
 
  if [ "$SUCCESS" = 1 ]; then
	sudo find /opt/BackUps/ -type f -mtime +7 -exec rm {} ;
  fi

Приведенный код скрипта предназначен для использования совместно с планировщиком заданий cron, о котором я писал здесь. Использоваться в журнале планировщика он может одним из приведенных ниже способов:

1
2
3
# Backup Alfresco
02 18 * * * sh /root/backUpiT.sh /opt/BackUps >> /root/backUpiT.log
02 18 * * * sh /root/backUpiT.sh /opt/BackUps >> /root/backUpiT.log >/dev/null 2>&1

 

Восстановление

Далее я приведу пример ручного восстановления из полученной резервной копии. Для этого этого необходимо последовательно выполнять слеждующие команды.

Для перехода в папку и распаковки архива:

1
2
cd ~
sudo tar xf 20160824193433.tar -C /opt/

Для перемещения из архивной папки:

1
sudo mv alfresco-5.0.d/ /opt/

Для назначения необходимых прав на запуск СУБД:

1
2
3
cd /opt/alfresco-5.0.d/
sudo chown -R postgres alf_data
sudo chown -R postgres postgresql

Для проверки функицонирования СУБД:

1
2
3
4
cd postgresql/
sudo rm -r postgresql.log
sudo service alfresco start postgresql
sudo service alfresco stop postgresql

Для очистки кэша и логов:

1
2
cd /opt/alfresco-5.0.d/tomcat/
sudo rm -r webapps/alfresco/ webapps/share/ webapps/solr4/ logs/* work/* temp/*

Для запуска сервиса:

1
sudo service alfresco start

 

Другие примеры скриптов

Далее,  для сравнения, приведу примеры других скриптов, которые тоже могут показаться интересными.

1) Скрипт холодного резервного копирования

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/bin/bash 
# This script perform cold full backup Alfresco CMS 
echo Time backup started = $(date +%T) 
before="$(date +%s)" 
# Live sync before stopping Alfresco to minimize sync time with the services down 
# Comment out the following 2 lines if you want to try single cold-sync only 
echo "Syncronize beafore backup ..." 
rsync -aHK --delete /opt/alfresco/ /opt/backup/alfresco 
before2="$(date +%s)" 
# Stop Alfresco Services 
echo Time befor stop Alfresco services = $(date +%T) 
echo "Stop Alfresco services ..." 
/opt/alfresco/alfresco.sh stop 
sleep 10 
echo Time after stop Alfresco services = $(date +%T) 
# Sync to backup directory 
echo "Syncronize to backup directory ..." 
rsync -aHK --delete /opt/alfresco/ /opt/backup/alfresco 
# Start Alfresco Services 
echo Time befor start Alfresco services = $(date +%T) 
echo "Start Alfresco services ..." 
cd /opt/alfresco/tomcat/logs 
/opt/alfresco/alfresco.sh start 
echo Time after start Alfresco services = $(date +%T) 
# Calculates and outputs amount of time the server was down for 
after="$(date +%s)" 
elapsed="$(expr $after - $before2)" 
hours=$(($elapsed / 3600)) 
elapsed=$(($elapsed - $hours * 3600)) 
minutes=$(($elapsed / 60)) 
seconds=$(($elapsed - $minutes * 60)) 
echo Server was down: "$hours hours $minutes minutes $seconds seconds" 
cp /opt/alfresco/properties.ini /opt/backup/alfresco/alfresco_version.txt 
# Display Alfresco services status 
echo Displaying Alfresco services status... 
/opt/alfresco/alfresco.sh status 
# Create archive of backed-up directory for offsite transfer 
echo "Create archive of backed-up directory for offsite transfer..." 
tar -zcf /opt/alfresco.tar.gz -C /opt/backup/alfresco . 
# Transfer backup to FTP server 
echo "Transfer backup archive to ftp server ..." 
cd /opt 
curl -T /opt/alfresco.tar.gz ftp://user:@server 
# Delete archive 
rm /opt/alfresco.tar.gz 
# Outputs the time the backup finished 
echo Time backup finished = $(date +%T) 
# Calculates and outputs total time taken 
after="$(date +%s)" 
elapsed="$(expr $after - $before)" 
hours=$(($elapsed / 3600)) 
elapsed=$(($elapsed - $hours * 3600)) 
minutes=$(($elapsed / 60)) 
seconds=$(($elapsed - $minutes * 60)) 
echo Time taken: "$hours hours $minutes minutes $seconds seconds"

2) Скрипт для горячего резервного копирования с использованием rsync демона на удаленной машине:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/bin/bash 
echo Time backup started = $(date +%T) 
### Time when backup is started 
before="$(date +%s)" 
######################## 
# Set environment:  
######################## 
# Optional hostname to adhere to pg_hba policies.  Will default to "localhost" if none specified. 
HOSTNAME="localhost" 
#Optional port to connect to database.  Will default to "5432" if none specified. 
PGPORT="5432" 
# Optional username to connect to database as.  Will default to "postgres" if none specified. 
USERNAME="postgres" 
# PG password 
export PGPASSWORD= 
# This dir will be created if it doesn't exist.  This must be writable by the user the script is running as. 
BACKUP_DIR="/opt/backup/sql/" 
# Optional database name to connect.  Will default to "alfresco" if none specified. 
DATABASE="alfresco" 
### Transfer env ########### 
# remote host for transfering 
RHOST="" 
# Remote user for connect to remote host 
RUSER= 
# Sourse directory for bakuping 
FILE_FROM=/opt/alfresco/alf_data/ 
# SQL dump share on remote host 
SQL_DUMP=sql_dump 
# Share on remote host to content files 
SHARE_DIR_TO=alf_data 
################### 
# SQL Backup      # 
################### 
echo "Start SQL backup ..." 
## Initialise defaults: 
if [ ! $HOSTNAME ]; then 
    HOSTNAME="localhost" 
fi; 
if [ ! $USERNAME ]; then 
    USERNAME="postgres" 
fi; 
if [ ! $PGPORT ]; then 
    PGPORT="5432" 
fi; 
if [ ! $DATABASE ]; then 
    DATABASE="alfresco" 
fi; 
## Dump Database 
/opt/alfresco/postgresql/bin/pg_dump -h "$HOSTNAME" -p "$PGPORT" -U "$USERNAME" -Fc "$DATABASE" > "$BACKUP_DIR"alfresco.dump 
############################################################# 
# File directory backup and transfer backupset (content+sql)# 
############################################################# 
echo Transfer DB dump ... 
rsync -auvHK --delete "$BACKUP_DIR" $RUSER@$RHOST::$SQL_DUMP 
echo Time after Backup and transfer DB = $(date +%T) 
# Sync to backup directory 
echo "Backup and transfer File directory ..." 
rsync -auvHK --delete --exclude='postgresql*' $FILE_FROM $RUSER@$RHOST::$SHARE_DIR_TO 
echo Time after backup and transfer File directory = $(date +%T) 
echo Backup finished. 
########################################## 
# Calculates and outputs total time taken# 
########################################## 
after="$(date +%s)" 
elapsed="$(expr $after - $before)" 
hours=$(($elapsed / 3600)) 
elapsed=$(($elapsed - $hours * 3600)) 
minutes=$(($elapsed / 60)) 
seconds=$(($elapsed - $minutes * 60)) 
echo Time taken: "$hours hours $minutes minutes $seconds seconds"

3) Скрипт для восстановления. Подразумевается, что имя и IP уже установлены в значения как у боевого сервера, а файлы копировались rsync-ом сразу в alf_data, т.е. их восстанавливать не надо:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/bin/bash 
# This script automate restore Alfresco CMS after remote backup via rsync. Restore procedure include next steps: 
# 1. Restore the database from the database backups and update statistics for all tables in the Alfresco 
#    schema (consult your DBA for the details on how to do this, as it varies from database to database). 
# 2. Start Alfresco 
# Changes: 
# 24.01.2013: Start AlexG 
# 1. Restore the database from the database backups and update statistics for all tables in the Alfresco 
#    schema (consult your DBA for the details on how to do this, as it varies from database to database). 
###################### 
# Restore SQL Backup # 
###################### 
## Set environment: 
# Optional hostname to adhere to pg_hba policies.  Will default to "localhost" if none specified. 
HOSTNAME="localhost" 
#Optional port to connect to database.  Will default to "5432" if none specified. 
PGPORT="5432" 
# Optional username to connect to database as.  Will default to "postgres" if none specified. 
USERNAME="postgres" 
export PGPASSWORD= 
# This dir will be created if it doesn't exist.  This must be writable by the user the script is running as. 
BACKUP_DIR="/opt/backup/sql/" 
# Optional database name to connect.  Will default to "alfresco" if none specified. 
DATABASE="alfresco" 
## Initialise defaults: 
if [ ! $HOSTNAME ]; then 
    HOSTNAME="localhost" 
fi; 
if [ ! $USERNAME ]; then 
    USERNAME="postgres" 
fi; 
if [ ! $PGPORT ]; then 
    PGPORT="5432" 
fi; 
if [ ! $DATABASE ]; then 
    DATABASE="alfresco" 
fi; 
# Start POSTGRESQL 
su - postgres -c "/opt/alfresco/postgresql/bin/pg_ctl start -w -D /opt/alfresco/alf_data/postgresql" 
## Restore Database dump 
/opt/alfresco/postgresql/bin/pg_restore -h "$HOSTNAME" -p "$PGPORT" -U "$USERNAME" -c -d "$DATABASE" "$BACKUP_DIR"alfresco.dump 
# Stop POSTGRESQL 
su - postgres -c "/opt/alfresco/postgresql/bin/pg_ctl stop -D /opt/alfresco/alf_data/postgresql" 
echo Time after Restore Backup SQL = $(date +%T) 
# 2. Start Alfresco 
echo Time befor start Alfresco services = $(date +%T) 
echo "Start Alfresco services ..." 
cd /opt/alfresco/tomcat/logs 
/opt/alfresco/alfresco.sh start 
echo Time after start Alfresco services = $(date +%T)

Ниже я приведу интересные ссылки. На этих ресурсах можно найти дополнительную инфомрацию не только по резервному копированию, но и по системе Alfresco в целом.

http://www.passivepress.com/2013/how-to-back-up-alfresco-step-by-step-with-script/

http://www.ossportal.ru/

Последний ресурс в настоящее время уже не поддерживается, но тем не менее является очень источником знаний для администраторов системы Alfresco.


Дополнение.

Проводя эксперименты с оптимизацией системы резервного копирования, в том числе испытывая различные архиваторы, выяснилось что архиватор 7-zip для резервного копирования систем Linux/Unix не подходит! 7-zip не сохраняет значения владельца/группы для файлов (ссылка).

Кроме этого, если требуется выполнять работы с резервными копиями в среде Microsoft Windows, но наиболее удобным будет использование стандартного архиватора ZIP, который отлично себя зарекомендовал как в среде Linux, так и Windows. А кроме того в отличие от архивов tar, позволяет извлекать отдельные файлы.

 


12th Сен 2016
Теги:
Загрузка Все права защищены © 2016 ИТ-Инженер (Краснодар)
 
把手拿回