我想将每个mysql表转储到单独的文件中.手册指出了这个的语法
mysqldump [options] db_name [tbl_name ...]
Run Code Online (Sandbox Code Playgroud)
这表示您事先知道了表名.我现在可以设置知道每个表名的脚本,但是说我在路上添加一个新表并忘记更新转储脚本.然后我错过了一个或多个表的转储.
有没有办法将每个现有表自动转储到单独的文件中?或者我将不得不做一些剧本; 查询数据库,获取所有表名,并按名称转储它们.
如果我使用script-fu路由,哪些脚本语言可以访问mysql数据库?
小智 59
mysqldump命令行程序为您完成此操作 - 尽管文档对此非常不清楚.
需要注意的一点是〜/ output/dir必须由拥有mysqld的用户写入.在Mac OS X上:
sudo chown -R _mysqld:_mysqld ~/output/dir
mysqldump --user=dbuser --password --tab=~/output/dir dbname
Run Code Online (Sandbox Code Playgroud)
运行上面的内容后,您将拥有一个tablename.sql文件,其中包含每个表的架构(create table statement)和包含该数据的tablename.txt文件.
如果只需要具有模式的转储,请添加--no-data标志:
mysqldump --user=dbuser --password --no-data --tab=~/output/dir dbname
Run Code Online (Sandbox Code Playgroud)
Tru*_*ane 59
这是一个脚本,它将表数据作为SQL命令转储到单独的压缩文件中.它不需要在MySQL服务器主机上,也不需要在脚本中硬编码密码,而只是针对特定的数据库,而不是服务器上的所有数据库:
#!/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: $DB.$t"
mysqldump -h $DB_host -u $DB_user -p$DB_pass $DB $t | gzip > $DIR/$DB.$t.sql.gz
tbl_count=$(( tbl_count + 1 ))
done
echo "$tbl_count tables dumped from database '$DB' into dir=$DIR"
Run Code Online (Sandbox Code Playgroud)
Eli*_*oyo 17
你可以通过以下方式完成
mysqldump# Optional variables for a backup script
MYSQL_USER="root"
MYSQL_PASS="something"
BACKUP_DIR=/srv/backup/$(date +%Y-%m-%dT%H_%M_%S);
test -d "$BACKUP_DIR" || mkdir -p "$BACKUP_DIR"
# Get the database list, exclude information_schema
for db in $(mysql -B -s -u $MYSQL_USER --password=$MYSQL_PASS -e 'show databases' | grep -v information_schema)
do
# dump each database in a separate file
mysqldump -u $MYSQL_USER --password=$MYSQL_PASS "$db" | gzip > "$BACKUP_DIR/$db.sql.gz"
done
Run Code Online (Sandbox Code Playgroud)
我最近需要备份一个大数据库(超过 250GB 的未压缩转储文件),我发现这个问题的答案非常有帮助。
我开始使用@Trutane 方法,它很有魅力。但我担心在不同的 mysql 会话中转储表,因为这可能在某些时刻导致备份不一致。
经过一些研究和测试,我开发了一种基于gawk. mysqldump基本思想是使用with创建整个数据库的转储--single-transaction=true,然后处理输出gawk,为每个表生成不同的文件。
所以我可以打电话:
mysqldump --single-transaction=true -u DBUSERNAME -p DBNAME | \
gawk -v 'database=DBNAME' -f 'backup.awk' -
Run Code Online (Sandbox Code Playgroud)
它在当前文件夹中生成一堆$database.$table.sql包含每个表的架构的文件和$database.$table.sql.gz包含每个表的内容的文件。由于 param --single-transaction=true,所有转储都发生在单个事务中,并且确保了数据一致性。
其内容为backup.awk:
# Split mysqldump output in different files, two per table:
# * First file is named $database.$table.sql and it contains the table schema
# * Second file is named $database.$table.sql.gz and it contains the table data
# The 'database' variable is expected to be provided in command-line
BEGIN {
insert=0
filename=sprintf("%s.header.sql", database);
}
# A line starting with "INSERT INTO" activates inserting mode
/^INSERT INTO/ { insert=1 }
# A line containing "-- Table structure for table `name-of-table`" finishes inserting mode
# It is also used to detect table name and change file names accordingly
match($0, /-- Table structure for table `(.*)`/, m) {
insert=0;
table=m[1];
filename=sprintf("%s.%s.sql", database, table);
print sprintf("Dumping table %s", table);
}
# If in inserting mode, line is piped to a gzipped file,
# if it is not, it is redirected to an uncompressed schema file
{
if (insert == 1) {
output = sprintf("gzip > %s.gz", filename);
print | output
} else {
print > filename;
}
}
Run Code Online (Sandbox Code Playgroud)
#!/bin/bash
for i in $(mysql -uUser -pPASSWORD DATABASE -e "show tables;"|grep -v Tables_in_);do mysqldump -uUSER -pPASSWORD DATABASE $i > /backup/dir/$i".sql";done
tar -cjf "backup_mysql_"$(date +'%Y%m%d')".tar.bz2" /backup/dir/*.sql
Run Code Online (Sandbox Code Playgroud)
小智 5
这是相应的导入.
#!/bin/bash
# import-files-mysql.sh
# Descr: Import separate SQL files for a specified database.
# Usage: Run without args for usage info.
# Author: Will Rubel
# Notes:
# * Script will prompt for password for db access.
[ $# -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
DIR=$DIR/*
echo -n "DB password: "
read -s DB_pass
echo
echo "Importing separate SQL command files for database '$DB' into '$DB'"
file_count=0
for f in $DIR
do
echo "IMPORTING FILE: $f"
gunzip -c $f | mysql -h $DB_host -u $DB_user -p$DB_pass $DB
(( file_count++ ))
done
echo "$file_count files importing to database '$DB'"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66858 次 |
| 最近记录: |