Это старая версия документа!
Содержание
Дамп баз данных с помощью 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