Дамп баз данных с помощью 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}
Печать/экспорт