Содержание
Дамп баз данных с помощью mysqldump
Только схему
mysqldump --no-data --routines --events db_name
Построчный дамп
Если необходимо сделать INSERT каждой записи отдельно (удобно для grep
):
mysqldump --default-character-set=utf8 --extended-insert=FALSE --complete-insert=TRUE database > dump.sql
Исключить таблицу из дампа
mysqldump ... --ignore-table=db_table > dump.sql
Исключить базы данных
DATABASES_TO_EXCLUDE="db1 db2 db3" EXCLUSION_LIST="'information_schema','mysql'" for DB in `echo "${DATABASES_TO_EXCLUDE}"` do EXCLUSION_LIST="${EXCLUSION_LIST},'${DB}'" done SQLSTMT="SELECT schema_name FROM information_schema.schemata" SQLSTMT="${SQLSTMT} WHERE schema_name NOT IN (${EXCLUSION_LIST})" MYSQLDUMP_DATABASES="--databases" for DB in `mysql -ANe"${SQLSTMT}"` do MYSQLDUMP_DATABASES="${MYSQLDUMP_DATABASES} ${DB}" done MYSQLDUMP_OPTIONS="--routines --triggers" mysqldump ${MYSQLDUMP_OPTIONS} ${MYSQLDUMP_DATABASES} > MySQLDatabases.sql
Исключить базы данных (2 вариант)
candidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$") mysqldump --databases $candidates
Исключить и сбросить каждую базу в отдельный файл:
candidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$") for candidate in $candidates[*]; do mysqldump $candidate done
Исключить базы данных (3 вариант)
mysqldump --databases `mysql --skip-column-names -e "SELECT GROUP_CONCAT(schema_name SEPARATOR ' ') FROM information_schema.schemata WHERE schema_name NOT IN ('mysql','performance_schema','information_schema');" >` >/mysql/backup/rds2.sql
Если количество БД измеряется десятками, метод не сработает, так как есть ограничение на GROUP_CONCAT (group_concat_max_len по-умолчанию = 1024).
Дамп каждой таблицы MySQL в отдельный файл
Синтаксис: ./eachtable.sh <DB_HOST> <DB_USER> <DB_NAME> [<DIR>]
Пароль спрашивается при выполнении.
- eachtable.sh
#!/bin/bash # dump-tables-mysql.sh # Descr: Dump MySQL table data into separate SQL files for a specified database. # Usage: Run without args for usage info. # Author: @Trutane # Ref: http://stackoverflow.com/q/3669121/138325 # Notes: # * Script will prompt for password for db access. # * Output files are compressed and saved in the current working dir, unless DIR is # specified on command-line. [ $# -lt 3 ] && echo "Usage: $(basename $0) <DB_HOST> <DB_USER> <DB_NAME> [<DIR>]" && exit 1 DB_host=$1 DB_user=$2 DB=$3 DIR=$4 [ -n "$DIR" ] || DIR=. test -d $DIR || mkdir -p $DIR echo -n "DB password: " read -s DB_pass echo echo "Dumping tables into separate SQL command files for database '$DB' into dir=$DIR" tbl_count=0 for t in $(mysql -NBA -h $DB_host -u $DB_user -p$DB_pass -D $DB -e 'show tables') do echo "DUMPING TABLE: $t" mysqldump -h $DB_host -u $DB_user -p$DB_pass $DB $t | gzip > $DIR/$t.sql.gz (( tbl_count++ )) done echo "$tbl_count tables dumped from database '$DB' into dir=$DIR"
Или вот такой скрипт всех таблиц вида «b_iblock_» из базы данных Bitrix «db_name»:
- inline_dump_table.sh
#!/bin/bash db_name='db_name';mysql -N information_schema -e \ "select table_name from tables where table_schema = '$db_name' and table_name like 'b_iblock_%'" | \ while read db_table; do; echo $db_table; mysqldump $db_name $db_table > $db_table.sql; done
Умный дамп БД
Пропуск больших таблиц.
- pull-db.sh
#!/bin/bash # # Получение данных из продовой БД # Пример запуска: DB_USER=... DB_PASS='...' DB_HOST=mysql.server.ru ./pull-db-from-prod.sh # set -euo pipefail set -x # Временная БД LOCAL_DB=${LOCAL_DB:=default} # Пользователь, пароль, хост, порт, БД DB_USER=${DB_USER:=user} DB_PASS=${DB_PASS:=password} DB_HOST=${DB_HOST:=localhost} DB_PORT=${DB_PORT:=3306} DB_NAME=${DB_NAME:=db-name} # Большие таблицы, из которых импортируются только последние записи через пробел LG_TABLES=${LG_TABLES:=telescope_entries failed_jobs} LG_LIMIT=${LG_LIMIT:=1000} # Выходной файл дампа FILE=${FILE:=/tmp/db-name.sql} if [ -f ${FILE} ]; then rm ${FILE} fi ### Run ########################################## function get_common_tables { EQ_OPERATOR="=" get_filter_tables } function get_lg_tables { EQ_OPERATOR=">" get_filter_tables } function get_filter_tables { TABLES=`mysql -NBA -h ${DB_HOST} -u ${DB_USER} -p${DB_PASS} --port ${DB_PORT} ${DB_NAME} -e "\ SELECT TABLE_NAME FROM information_schema.tables \ WHERE TABLE_SCHEMA = '${DB_NAME}' \ AND POSITION(CONCAT(' ', TABLE_NAME, ' ') in ' ${LG_TABLES} ') $EQ_OPERATOR 0"` } function export_common { get_common_tables mysqldump --column-statistics=0 --triggers -h ${DB_HOST} -u ${DB_USER} -p${DB_PASS} --port ${DB_PORT} ${DB_NAME} ${TABLES} >> "$FILE" } function export_lg { get_lg_tables for TABLE in $TABLES; do PK=`mysql -NBA -h ${DB_HOST} -u ${DB_USER} -p${DB_PASS} --port ${DB_PORT} ${DB_NAME} -e "\ SELECT GROUP_CONCAT(COLUMN_NAME SEPARATOR ', ') FROM information_schema.COLUMNS WHERE (TABLE_SCHEMA = '${DB_NAME}') AND (TABLE_NAME = '${TABLE}') AND (COLUMN_KEY = 'PRI')"` mysqldump --column-statistics=0 -h ${DB_HOST} -u ${DB_USER} -p${DB_PASS} --port ${DB_PORT} -w "1=1 ORDER BY ${PK} DESC LIMIT ${LG_LIMIT}" ${DB_NAME} ${TABLE} >> "$FILE" done } export_common export_lg >&2 echo DB dump is stored in ${FILE} mysql ${LOCAL_DB} < ${FILE}