-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathdb_export.sh
executable file
·237 lines (189 loc) · 9.52 KB
/
db_export.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
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
#!/bin/bash
pushd `dirname $0` > /dev/null
PATH_PWD=`pwd`
popd > /dev/null
EVENT_NAME="ModX DB export"
declare -A CONFIG
source $PATH_PWD/functions/common.sh
include $PATH_PWD/functions/files.sh
check_config
include $PATH_PWD/functions/bash-ini-parser/bash-ini-parser
cfg_parser $PATH_PWD/config.ini
# исправим не правильно сформированный ini файл (не обязательно)
# cfg_writer
# импортируем секции из ini
cfg_section_common
cfg_section_server
# подгржаем файл глобальных переменных
include $PATH_PWD/functions/parse_args.sh $@
# source $PATH_PWD/functions/parse_args.sh
include $PATH_PWD/functions/vars.sh
console_log -c=bg_yellow event $EVENT_NAME
if [[ -n ${DB_TABLES_REMOVE_INSERT} ]]; then
console_log "remove: ${DB_TABLES_REMOVE_INSERT}"
DB_TABLES_REMOVE_INSERT="("$(sed -E 's/\s+/\|/g' <<< $DB_TABLES_REMOVE_INSERT)")"
fi
get_provider
console_log "Database is ${DB_CONFIG_HOST}:${DB_CONFIG_DBASE}"
get_host
# очищаем директорию для хранения данных
clean_files
# переменные соединения с БД
# CONNECT="mysql -h ${DB_CONFIG_HOST} -u ${DB_CONFIG_USER} -p${DB_CONFIG_PASSWORD} -D ${DB_CONFIG_DBASE} -Bse"
MYSQL_ARGS="-h ${DB_CONFIG_HOST} -u ${DB_CONFIG_USER} -p${DB_CONFIG_PASSWORD}"
MYSQL_QUERY="mysql ${MYSQL_ARGS} -D ${DB_CONFIG_DBASE} -Bse"
# MYSQL_DUMP="mysqldump ${MYSQL_ARGS} -c -t -q ${DB_CONFIG_DBASE}"
# MYSQL_DUMP="mysqldump ${MYSQL_ARGS} --complete-insert --compact ${DB_CONFIG_DBASE}"
# MYSQL_DUMP="mysqldump ${MYSQL_ARGS} --opt --extended-insert=FALSE ${DB_CONFIG_DBASE}"
# MYSQL_DUMP="mysqldump ${MYSQL_ARGS} --extended-insert --skip-comments --ignore-table=${DB_CONFIG_DBASE}.${DB_CONFIG_TABLE_PREFIX}user_attributes ${DB_CONFIG_DBASE}"
# MYSQL_DUMP="mysqldump ${MYSQL_ARGS} --extended-insert --skip-comments --ignore-table=${DB_CONFIG_DBASE}.${DB_CONFIG_TABLE_PREFIX}user_attributes ${DB_CONFIG_DBASE}"
# MYSQL_DUMP="mysqldump ${MYSQL_ARGS} --complete-insert ${DB_CONFIG_DBASE}"
MYSQL_DUMP="mysqldump ${MYSQL_ARGS} --opt --skip-extended-insert ${DB_CONFIG_DBASE}"
TABLES_EXCLUDE=''
if [[ -n "${DB_TABLES_EXCLUDE[*]}" ]]; then
# console_log ZZZ
# exit 1;
# исключаем таблицы из экспорта
if [[ $DB_TABLES_AUTOPREFIX = 1 ]] && [[ -n "$DB_TABLES_AUTOPREFIX" ]]; then
# console_log 'Добавляю префиксы'
i=0
for arg in ${DB_TABLES_EXCLUDE[*]}; do
DB_TABLES_EXCLUDE[$i]="${DB_CONFIG_TABLE_PREFIX}${arg}";
((i += 1))
done
fi
# TABLES_EXCLUDE=" AND \`Tables_in_${DB_CONFIG_DBASE}\` NOT IN (\"${DB_TABLES_EXCLUDE[*]}\")"
console_log WARN "Исключаю из экспорта таблицы ${DB_TABLES_EXCLUDE[@]}"
fi
if [[ -n "${DB_TABLES_DEFAULT[*]}" ]]; then
console_log err "Список таблиц в записях которых будут сброшенны поля на значения по умолчанию: ${DB_TABLES_DEFAULT[*]}"
# исключаем таблицы из экспорта которые должны быть добавлены, но импортированы
# в запрос будут другим способом
if [[ $DB_TABLES_AUTOPREFIX = 1 ]] && [[ -n "$DB_TABLES_AUTOPREFIX" ]]; then
# console_log 'Добавляю префиксы'
i=0
for arg in ${DB_TABLES_DEFAULT[*]}; do
DB_TABLES_DEFAULT_WP[$i]="${DB_CONFIG_TABLE_PREFIX}${arg}";
((i += 1))
done
fi
unset $arg
# TABLES_EXCLUDE=" AND \`Tables_in_${DB_CONFIG_DBASE}\` NOT IN (\"${DB_TABLES_DEFAULT_WP[*]}\")"
console_log WARN "Исключаю из экспорта таблицы очистки ${DB_TABLES_DEFAULT_WP[@]}"
fi
DB_TABLES_EXCLUDE=("${DB_TABLES_EXCLUDE[@]}" "${DB_TABLES_DEFAULT_WP[@]}")
if [[ -n "${TABLES_EXCLUDE[*]}" ]]; then
TABLES_EXCLUDE_STR=" AND \`Tables_in_${DB_CONFIG_DBASE}\` NOT IN (\"$(join_by '","' ${TABLES_EXCLUDE[@]})\")"
console_log WARN "Исключаю из экспорта таблицы: ${TABLES_EXCLUDE_STR}"
fi
if [[ -n "${DB_TABLES_INCLUDE[*]}" ]]; then
if [[ $DB_TABLES_AUTOPREFIX = 1 ]] && [[ -n "$DB_TABLES_AUTOPREFIX" ]]; then
i=0
for arg in ${DB_TABLES_INCLUDE[*]}; do
DB_TABLES_INCLUDE[$i]="${DB_CONFIG_TABLE_PREFIX}${arg}";
((i += 1))
done
fi
TABLES_INCLUDE=" \`Tables_in_${DB_CONFIG_DBASE}\` IN (\"$(join_by '","' ${DB_TABLES_INCLUDE[@]})\")"
console_log WARN "Включаю в экспорт таблицы: ${TABLES_INCLUDE[*]}"
fi
TABLES_RESULT_LIST=''
NO_TABLES=0
# вычисляем пересечение массивов чтоб в запрос отправить список только нужных таблице
if [[ -n "${DB_TABLES_INCLUDE[*]}" ]] && [[ -n "${DB_TABLES_EXCLUDE[*]}" ]]; then
intersections_tables=()
for item1 in ${DB_TABLES_INCLUDE[@]}; do
# console_log warn $item1
in_both=""
for item2 in ${DB_TABLES_EXCLUDE[@]}; do
[ "$item1" == "$item2" ] && in_both=Yes
done
if [[ ! -n "${in_both}" ]]; then
intersections_tables+=( "$item1" )
fi
done
if [[ -n "${intersections_tables[*]}" ]];then
# console_log "okkkk"
TABLES_RESULT_LIST=" \`Tables_in_${DB_CONFIG_DBASE}\` IN (\"$(join_by '","' ${intersections_tables[@]})\")"
else
NO_TABLES=1
# console_log "faaaalse"
fi
elif [[ -n "${DB_TABLES_EXCLUDE[*]}" ]]; then
TABLES_RESULT_LIST=" \`Tables_in_${DB_CONFIG_DBASE}\` NOT IN (\"$(join_by '","' ${DB_TABLES_EXCLUDE[@]})\")"
elif [[ -n "${DB_TABLES_INCLUDE[*]}" ]]; then
TABLES_RESULT_LIST=" \`Tables_in_${DB_CONFIG_DBASE}\` IN (\"$(join_by '","' ${DB_TABLES_INCLUDE[@]})\")"
fi
if (( ! $NO_TABLES )); then
TABLES=$(eval "$MYSQL_QUERY 'SHOW TABLES WHERE ${TABLES_RESULT_LIST} AND \`Tables_in_${DB_CONFIG_DBASE}\` LIKE \"${DB_CONFIG_TABLE_PREFIX}%\";'"2>&1 2>/dev/null);
# console_log "$MYSQL_QUERY 'SHOW TABLES WHERE ${TABLES_RESULT_LIST} AND \`Tables_in_${DB_CONFIG_DBASE}\` LIKE \"${DB_CONFIG_TABLE_PREFIX}%\";'";
# заменяем перенос строки
# TABLES=$(sed 's/\\n/_/g' <<< $TABLES)
TABLES=$(sed ':a;N;$!ba;s/\n/ /g' <<< $TABLES)
# console_log WARN "Dump tables: ${TABLES}"
$([[ -n "${TABLES}" ]] && console_log WARN "Dump tables: ${TABLES}" || console_log warn "Dump EVERY tables")
# if [[ -n "${TABLES}" ]];then console_log "Dump tables: ${TABLES}"; else console_log warn "Dump EVERY tables"; fi
DUMP=$(eval "${MYSQL_DUMP} ${TABLES}" 2>/dev/null);
if [[ -n "${DB_TABLES_REMOVE_INSERT}" ]]; then
# -e "^--" оставляет все строки кроме тех что начинаются с --
# printf '%s\n' "${DUMP}" | grep -E \
DUMP=$(printf '%s\n' "${DUMP}" | grep -vE \
-e "^INSERT INTO \`${DB_CONFIG_TABLE_PREFIX}${DB_TABLES_REMOVE_INSERT}\`");
# -e "^INSERT INTO \`${DB_CONFIG_TABLE_PREFIX}${DB_TABLES_REMOVE_INSERT}\`" > "${DB_BACKUP_FILE}";
# -e "^INSERT INTO \`S_lUg6_(manager_log)\`" > $DB_BACKUP_FILE;
$(echo "${DUMP}" > "${DB_BACKUP_FILE}")
# console_log "xxx=${DB_BACKUP_FILE}2"
# exit 111;
# cat /var/www/extrusion.bp/.git-db-watcher/backups/db.sql | grep -vE -e "^INSERT INTO `S_lUg6_(manager_log)`"
console_log "^INSERT INTO \`${DB_CONFIG_TABLE_PREFIX}${DB_TABLES_REMOVE_INSERT}\`"
console_log "Удалил лишние данные из запроса и произвел запись в: ${DB_BACKUP_FILE}"
TEST=$(ls -lARGh $DB_BACKUP_PATH && cat ${DB_BACKUP_FILE} | grep --color=always -P "${DB_CONFIG_TABLE_PREFIX}${DB_TABLES_REMOVE_INSERT}" | cut -c 1-70)
console_log "Проверка результата: ${TEST}"
# exit 111;
# else
# -e "^--" оставляет все строки кроме тех что начинаются с --
fi
printf '%s\n' "${DUMP}" | grep -vE \
-e "^--" > $DB_BACKUP_FILE;
else
console_log "Tables not set, create empty file: ${DB_BACKUP_FILE}"
touch $DB_BACKUP_FILE;
fi
# exit 1;
# именно в этом месте чтобы подхватить глобальные переменные
include $PATH_PWD/functions/db.sh
if [[ -n "${DB_TABLES_DEFAULT[*]}" ]]; then
console_log WARN "Очищаю таблицы очистки: ${DB_TABLES_DEFAULT[@]}"
# console_log 'Очищаю поля у таблиц'
clear_fields ${DB_TABLES_DEFAULT[*]}
fi
if [[ -n "${DB_BACKUP_PATH_TMP}" ]]; then
find ${DB_BACKUP_PATH_TMP} -type f -name "*.sql" -print0 | while read -d $'\0' file
do
# склеим все временные файлы с основным файлом
# echo $(cat $f >> $DB_BACKUP_FILE);
cat $file >> $DB_BACKUP_FILE;
console_log "Склеил ${file} с основным файлом ${DB_BACKUP_FILE}"
done
find "${DB_BACKUP_PATH_TMP}" -mindepth 1 -type f -name "*.sql" -delete
console_log warn "Удалил содержимое временной папки: ${DB_BACKUP_PATH_TMP}"
fi
if [[ -n "${CONFIG[output]}" ]]; then
# DB_BACKUP_FILE="$PATH_PWD/null.txt"
# console_log err "==${CONFIG[output]}=={$DB_BACKUP_FILE}=="
# не забываем это отправляется в стандартный вывод
# а на экране мы видим только вывод ошибок
[ ! -f "$DB_BACKUP_FILE" ] && {
console_log ERROR "$DB_BACKUP_FILE file not found.";
console_log -c=bg_yellow event $EVENT_NAME "\e[1mFINISHED\e[22m"
exit 101;
}
if [ -s "$DB_BACKUP_FILE" ]
then
cat $DB_BACKUP_FILE
console_log "Отправил содержимое файла на стандартный вывод"
else
console_log -c='bg_red' "Файл выгрузки пустой!!!"
fi
fi
console_log -c=bg_yellow event $EVENT_NAME "FINISHED"