-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmage-dbdump.sh
executable file
·193 lines (157 loc) · 5.66 KB
/
mage-dbdump.sh
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#!/bin/bash
IGNORE_TABLES=( dataflow_batch_export dataflow_batch_import log_customer log_quote log_summary log_summary_type log_url log_url_info log_visitor log_visitor_info log_visitor_online report_event index_event enterprise_logging_event_changes core_cache core_cache_tag core_session core_cache_tag )
IGNORE_TABLES_AGGRESSIVE=( report_compared_product_index report_viewed_product_index sales_flat_quote_address sales_flat_quote_shipping_rate enterprise_customer_sales_flat_quote enterprise_customer_sales_flat_quote_address sales_flat_quote )
TRUNCATE_TABLES=( dataflow_batch_export dataflow_batch_import log_customer log_quote log_summary log_summary_type log_url log_url_info log_visitor log_visitor_info log_visitor_online report_viewed_product_index report_compared_product_index report_event index_event index_process_event )
CONFIG_FILE="./app/etc/local.xml"
DUMP_FILE="./var/db.sql"
function usage()
{
cat <<EOF
Usage: $0 [OPTIONS]
Version: 1.03
Author: www.sonassihosting.com
Download: sys.sonassi.com/mage-dbdump.sh
This script is used to dump or restore Magento databases by reading
the local.xml file and parsing the DB credentials. It strips out
superfluous data (logs etc.) for smaller and quicker dumps. It also
optimises the dump by avoiding locks where possible.
Dumps to $DUMP_FILE(.gz)
If you have pigz installed, it will use that over gzip for parallel
compression/de-compression.
OPTIONS:
-a Advertise awesome hosting
-d Dump the database
-r Restore the databse
-z Use gzip compression (use with -d or -r)
-e Use extended inserts
-h Show help/usage
-f Full dump, do not exclude any tables
-A Aggressive dump, exclude (${IGNORE_TABLES_AGGRESSIVE[@]})
-F Do not ask questions and force all actions
-i Interactive, enter a mysql> prompt
-c Clean log and index tables
EOF
}
function error()
{
echo -e "Error: $1"
[[ ! "$2" == "noexit" ]] && exit 1
}
function getParam()
{
RETVAL=$(grep -Eoh "<$1>(<!\[CDATA\[)?(.*)(\]\]>)?<\/$1>" $TMP_FILE | sed "s#<$1><!\[CDATA\[##g;s#\]\]><\/$1>##g")
if [[ "$2" == "sanitise" ]]; then
RETVAL=$(echo "$RETVAL" | sed 's/"/\\\"/g')
fi
echo -e "$RETVAL"
}
function compress()
{
while read DATA; do
[[ ! "$OPT_z" == "" ]] && (echo "$DATA" | $GZIP_CMD -) || echo "$DATA"
done
}
function mysqldumpit()
{
if [[ ! "OPT_f" == "" ]]; then
[[ ! "$OPT_A" == "" ]] && IGNORE_TABLES=( $IGNORE_TABLES $IGNORE_TABLES_AGGRESSIVE )
for TABLE in "${IGNORE_TABLES[@]}"; do
IGNORE_STRING="$IGNORE_STRING --ignore-table=$DBNAME.$TABLE_PREFIX$TABLE"
done
fi
# We use --single-transaction in favour of --lock-tables=false , its slower, but less potential for unreliable dumps
( mysqldump -p"$DBPASS" $MYSQL_ARGS --no-data --routines --triggers --single-transaction; \
mysqldump -p"$DBPASS" $MYSQL_ARGS $IGNORE_STRING --no-create-db --single-transaction )
}
function question()
{
[[ ! "$OPT_F" == "" ]] && return 0
echo -n "$1 [y/N]: "
read CONFIRM
[[ "$CONFIRM" == "y" ]] || [[ "$CONFIRM" == "Y" ]] && return 0
return 1
}
function message()
{
STRIP=$(for i in {1..38}; do echo -n "#"; done)
echo -e "$STRIP\n$1\n$STRIP"
}
function banner()
{
cat <<EOT
######################################
(_)
___ ___ _ __ __ _ ___ ___ _
/ __|/ _ \| '_ \ / _' / __/ __| |
\__ \ (_) | | | | (_| \__ \__ \ |
|___/\___/|_| |_|\__'_|___/___/_|
For truly optimised Magento hosting
Use http://www.sonassihosting.com ...
#####################################
EOT
}
[ ! -f "$CONFIG_FILE" ] && error "$CONFIG_FILE does not exist"
while getopts ":drzehfFaic" OPTION; do
case $OPTION in
a)
banner
exit 0
;;
h)
usage
exit 0
;;
:)
error "Error: -$OPTION requires an argument" noexit
usage
exit 1
;;
\?)
error "Error: unknown option -$OPTION" noexit
usage
exit 1
;;
*)
[[ "$OPTARG" == "" ]] && OPTARG='"-'$OPTION' 1"'
OPTION="OPT_$OPTION"
eval ${OPTION}=$OPTARG
;;
esac
done
[[ "$OPT_c$OPT_i$OPT_d$OPT_r" == "" ]] && usage && exit 1
which mktemp >/dev/null 2>&1
[ $? -eq 0 ] && TMP_FILE=$(mktemp ./var/local.xml.XXXXX) || TMP_FILE="./var/.tmp.local.xml"
sed -ne '/default_setup/,/\/default_setup/p' $CONFIG_FILE > $TMP_FILE
which pigz >/dev/null 2>&1
[ $? -eq 0 ] && GZIP_CMD="pigz" || GZIP_CMD="gzip"
IGNORE_STRING=""
DBHOST=$(getParam "host")
DBUSER=$(getParam "username")
DBPASS=$(getParam "password" "sanitise" )
DBNAME=$(getParam "dbname")
TABLE_PREFIX=$(getParam "table_prefix")
[ -f $TMP_FILE ] && rm $TMP_FILE
[[ ! "$OPT_z" == "" ]] && DUMP_FILE="$DUMP_FILE"".gz"
MYSQL_ARGS="-h $DBHOST -u $DBUSER $DBNAME"
[[ ! "$OPT_e" == "" ]] && MYSQL_ARGS="$MYSQL_ARGS --extended-insert=FALSE --complete-insert=TRUE"
if [[ ! "$OPT_r" == "" ]]; then
[ ! -f "$DUMP_FILE" ] && error "SQL file does not exist"
question "Are you sure you want to restore $DUMP_FILE to $DBNAME?"
if [ $? -eq 0 ]; then
[[ ! "$OPT_z" == "" ]] && $GZIP_CMD -d <$DUMP_FILE | mysql $MYSQL_ARGS -p"$DBPASS" || mysql $MYSQL_ARGS -p"$DBPASS" <$DUMP_FILE
message "MYSQL IMPORT COMPLETE"
banner
fi
exit 0
elif [[ ! "$OPT_c" == "" ]]; then
for TABLE in ${TRUNCATE_TABLES[@]}; do
echo "Cleaning $TABLE ..."
mysql $MYSQL_ARGS -p"$DBPASS" -e "TRUNCATE ${TABLE_PREFIX}$TABLE"
done
elif [[ ! "$OPT_i" == "" ]]; then
mysql $MYSQL_ARGS -p"$DBPASS"
elif [[ ! "$OPT_d" == "" ]]; then
[[ ! "$OPT_z" == "" ]] && mysqldumpit | $GZIP_CMD > $DUMP_FILE || mysqldumpit > $DUMP_FILE
message "MYSQL DUMP COMPLETE"
exit 0
fi