@@ -20,7 +20,7 @@ POSTGRES_VERSION_DEFAULT=10
20
20
AWS_BLOCK_DURATION=0
21
21
22
22
# ######################################
23
- # Attach ebs drive with db backup
23
+ # Attach an EBS volume containing the database backup (made with pg_basebackup)
24
24
# Globals:
25
25
# DOCKER_MACHINE, AWS_REGION, DB_EBS_VOLUME_ID
26
26
# Arguments:
@@ -32,12 +32,13 @@ function attach_db_ebs_drive() {
32
32
docker-machine ssh $DOCKER_MACHINE " sudo sh -c \" mkdir /home/backup\" "
33
33
docker-machine ssh $DOCKER_MACHINE " wget http://s3.amazonaws.com/ec2metadata/ec2-metadata"
34
34
docker-machine ssh $DOCKER_MACHINE " chmod u+x ec2-metadata"
35
- instance_id=$( docker-machine ssh $DOCKER_MACHINE ./ec2-metadata -i)
35
+ local instance_id=$( docker-machine ssh $DOCKER_MACHINE ./ec2-metadata -i)
36
36
instance_id=${instance_id: 13}
37
- attachResult=$( aws --region=$AWS_REGION ec2 attach-volume --device /dev/xvdc --volume-id $DB_EBS_VOLUME_ID --instance-id $instance_id )
37
+ local attach_result=$( aws --region=$AWS_REGION ec2 attach-volume \
38
+ --device /dev/xvdc --volume-id $DB_EBS_VOLUME_ID --instance-id $instance_id )
38
39
sleep 10
39
40
docker-machine ssh $DOCKER_MACHINE sudo mount /dev/xvdc /home/backup
40
- docker-machine ssh $DOCKER_MACHINE " sudo df -h /dev/xvdc"
41
+ dbg $( docker-machine ssh $DOCKER_MACHINE " sudo df -h /dev/xvdc" )
41
42
}
42
43
43
44
# ######################################
@@ -160,17 +161,22 @@ function help() {
160
161
- dump in \" custom\" format, made with 'pg_dump -Fc ..' ('*.pgdmp'),
161
162
* sequence of SQL commands specified as in a form of plain text.
162
163
164
+ \033[1m--db-name\033[22m (string)
165
+
166
+ Name of database which must be tested. Name 'test' is internal used name,
167
+ so is not correct value.
168
+
163
169
\033[1m--db-ebs-volume-id\033[22m (string)
164
170
165
- Id of Amazon ebs volume with backup of database .
171
+ ID of an AWS EBS volume, containing the database backup (made with pg_basebackup) .
166
172
167
- In root of drive expected be found
173
+ In the volume's root directory, the following two files are expected:
168
174
- base.tar.gz
169
- - pg_xlog.tar.gz
175
+ - pg_xlog.tar.gz for Postgres version up to 9.6 or pg_wal.tar.gz for Postgres 10+
170
176
171
- Created as result of execution :
172
- 'pg_basebackup -U postgres -z -ZX -P -Ft - D /ebs-db-vol- root'
173
- where X any compression level.
177
+ The following command can be used to get such files :
178
+ 'pg_basebackup -U postgres -zPFt -Z 5 - D /path/to/ ebs/volume/ root'
179
+ Here '-Z 5' means that level 5 to be used for compression, you can choose any value from 0 to 9 .
174
180
175
181
176
182
\033[1m--db-pgbench\033[22m (string)
@@ -541,7 +547,8 @@ function check_cli_parameters() {
541
547
[[ ! -z ${WORKLOAD_CUSTOM_SQL+x} ]] && let workloads_count=$workloads_count +1
542
548
[[ ! -z ${WORKLOAD_PGBENCH+x} ]] && let workloads_count=$workloads_count +1
543
549
544
- if [[ -z ${DB_PREPARED_SNAPSHOT+x} ]] && [[ -z ${DB_DUMP+x} ]] && [[ -z ${DB_PGBENCH+x} ]] && [[ -z ${DB_EBS_VOLUME_ID+x} ]]; then
550
+ if [[ -z ${DB_PREPARED_SNAPSHOT+x} ]] && [[ -z ${DB_DUMP+x} ]] \
551
+ && [[ -z ${DB_PGBENCH+x} ]] && [[ -z ${DB_EBS_VOLUME_ID+x} ]]; then
545
552
err " ERROR: The object (database) is not defined."
546
553
exit 1
547
554
fi
@@ -1140,7 +1147,7 @@ elif [[ "$RUN_ON" == "aws" ]]; then
1140
1147
msg " To connect docker machine use:"
1141
1148
msg " docker-machine ssh $DOCKER_MACHINE "
1142
1149
1143
- if [[ ! -z ${DB_EBS_VOLUME_ID+x} ]]; then
1150
+ if [[ " $RUN_ON " == " aws " ]] && [[ ! -z ${DB_EBS_VOLUME_ID+x} ]]; then
1144
1151
attach_db_ebs_drive;
1145
1152
fi
1146
1153
@@ -1151,7 +1158,7 @@ elif [[ "$RUN_ON" == "aws" ]]; then
1151
1158
else
1152
1159
msg " Use EBS volume"
1153
1160
# Create new volume and attach them for non i3 instances if needed
1154
- if [ ! -z ${AWS_EBS_VOLUME_SIZE+x} ]; then
1161
+ if [[ " $RUN_ON " == " aws " ]] && [[ ! -z ${AWS_EBS_VOLUME_SIZE+x} ] ]; then
1155
1162
use_ec2_ebs_drive $AWS_EBS_VOLUME_SIZE
1156
1163
fi
1157
1164
fi
@@ -1179,7 +1186,7 @@ alias docker_exec='docker $DOCKER_CONFIG exec -i ${CONTAINER_HASH} '
1179
1186
CPU_CNT=$( docker_exec bash -c " cat /proc/cpuinfo | grep processor | wc -l" ) # for execute in docker
1180
1187
1181
1188
# ######################################
1182
- # Extract database backup from attached ebs volume to database
1189
+ # Extract the database backup from the attached EBS volume.
1183
1190
# Globals:
1184
1191
# PG_VERSION
1185
1192
# Arguments:
@@ -1189,25 +1196,31 @@ CPU_CNT=$(docker_exec bash -c "cat /proc/cpuinfo | grep processor | wc -l") # fo
1189
1196
# ######################################
1190
1197
function cp_db_ebs_backup() {
1191
1198
# Here we think what postgress stopped
1192
- msg " Restore(cp) database backup. "
1199
+ msg " Extract database backup from EBS volume "
1193
1200
docker_exec bash -c " rm -rf /var/lib/postgresql/9.6/main/*"
1194
1201
1195
- OP_START_TIME =$( date +%s) ;
1202
+ local op_start_time =$( date +%s) ;
1196
1203
docker_exec bash -c " rm -rf /var/lib/postgresql/$PG_VERSION /main/*"
1197
- docker_exec bash -c " tar -C /storage/postgresql/$PG_VERSION /main/ -xzvf /backup/base.tar.gz"
1198
- docker_exec bash -c " tar -C /storage/postgresql/$PG_VERSION /main/pg_xlog -xzvf /backup/pg_xlog.tar.gz"
1199
- END_TIME=$( date +%s) ;
1200
- DURATION=$( echo $(( END_TIME- OP_START_TIME)) | awk ' {printf "%d:%02d:%02d", $1/3600, ($1/60)%60, $1%60}' )
1201
- msg " Backup copied for $DURATION ."
1204
+ docker_exec bash -c " ([[ -f /backup/base.tar.gz ]] && tar -C /storage/postgresql/$PG_VERSION /main/ -xzvf /backup/base.tar.gz) || true"
1205
+ docker_exec bash -c " ([[ -f /backup/base.tar ]] && tar -C /storage/postgresql/$PG_VERSION /main/ -xvf /backup/base.tar) || true"
1206
+ docker_exec bash -c " ([[ -f /backup/pg_xlog.tar.gz ]] && tar -C /storage/postgresql/$PG_VERSION /main/pg_xlog -xzvf /backup/pg_xlog.tar.gz) || true"
1207
+ docker_exec bash -c " ([[ -f /backup/pg_wal.tar.gz ]] && tar -C /storage/postgresql/$PG_VERSION /main/pg_xlog -xzvf /backup/pg_wal.tar.gz) || true"
1208
+ docker_exec bash -c " ([[ -f /backup/pg_xlog.tar ]] && tar -C /storage/postgresql/$PG_VERSION /main/pg_xlog -xvf /backup/pg_xlog.tar) || true"
1209
+ docker_exec bash -c " ([[ -f /backup/pg_wal.tar ]] && tar -C /storage/postgresql/$PG_VERSION /main/pg_xlog -xvf /backup/pg_wal.tar) || true"
1210
+
1211
+ local end_time=$( date +%s) ;
1212
+ local duration=$( echo $(( end_time- op_start_time)) | awk ' {printf "%d:%02d:%02d", $1/3600, ($1/60)%60, $1%60}' )
1213
+ msg " Time taken to extract database backup from EBS volume: $duration ."
1202
1214
1203
1215
docker_exec bash -c " chown -R postgres:postgres /storage/postgresql/$PG_VERSION /main"
1204
1216
docker_exec bash -c " localedef -f UTF-8 -i en_US en_US.UTF-8"
1217
+ docker_exec bash -c " localedef -f UTF-8 -i en_US ru_RU.UTF-8"
1205
1218
}
1206
1219
1207
1220
# ######################################
1208
- # Dettach drive with database backup
1221
+ # Detach EBS volume
1209
1222
# Globals:
1210
- # DOCKER_MACHINE, DB_EBS_VOLUME_ID
1223
+ # DOCKER_MACHINE, DB_EBS_VOLUME_ID, AWS_REGION
1211
1224
# Arguments:
1212
1225
# None
1213
1226
# Returns:
@@ -1216,7 +1229,7 @@ function cp_db_ebs_backup() {
1216
1229
function dettach_db_ebs_drive() {
1217
1230
docker_exec bash -c " umount /backup"
1218
1231
docker-machine ssh $DOCKER_MACHINE sudo umount /home/backup
1219
- dettachResult =$( aws --region=$AWS_REGION ec2 detach-volume --volume-id $DB_EBS_VOLUME_ID )
1232
+ local dettach_result =$( aws --region=$AWS_REGION ec2 detach-volume --volume-id $DB_EBS_VOLUME_ID )
1220
1233
}
1221
1234
1222
1235
docker_exec bash -c " mkdir $MACHINE_HOME && chmod a+w $MACHINE_HOME "
@@ -1232,7 +1245,7 @@ if [[ "$RUN_ON" == "aws" ]]; then
1232
1245
docker_exec bash -c " ln -s /storage/postgresql /var/lib/postgresql"
1233
1246
1234
1247
if [[ ! -z ${DB_EBS_VOLUME_ID+x} ]]; then
1235
- cp_db_ebs_backup;
1248
+ cp_db_ebs_backup
1236
1249
dettach_db_ebs_drive
1237
1250
fi
1238
1251
@@ -1594,7 +1607,7 @@ function collect_results() {
1594
1607
msg " Time taken to generate and collect artifacts: $DURATION ."
1595
1608
}
1596
1609
1597
- if [[ ! -z ${DB_EBS_VOLUME_ID+x} ]]; then
1610
+ if [[ ! -z ${DB_EBS_VOLUME_ID+x} ]] && [[ ! " $DB_NAME " == " test " ]] ; then
1598
1611
docker_exec bash -c " psql --set ON_ERROR_STOP=on -U postgres -c 'drop database if exists test;'"
1599
1612
docker_exec bash -c " psql --set ON_ERROR_STOP=on -U postgres -c 'alter database $DB_NAME rename to test;'"
1600
1613
DB_NAME=test
0 commit comments