Дамп баз данных с помощью 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