将所有的MySQL表自动转储到单独的文件?

我想把每个mysql表转储到单独的文件。 手册指出这是这样的语法

mysqldump [options] db_name [tbl_name ...] 

这表示您事先知道表名。 我可以设置知道每个表名的脚本,但是说我在路上添加一个新表,并忘记更新转储脚本。 然后我丢失一个或多个表的转储。

有没有办法自动将每个现有的表转储到一个单独的文件? 或者我将不得不做一些剧本; 查询数据库,获取所有的表名,并通过名称转储它们。

如果我去脚本fu路由,什么脚本语言可以访问mysql数据库?

mysqldump命令行程序为你做这件事 – 虽然这个文件是非常不清楚的。

有一点需要注意的是,〜/ output / dir必须由拥有mysqld的用户写入。 在Mac OS X上:

 sudo chown -R _mysqld:_mysqld ~/output/dir mysqldump --user=dbuser --password --tab=~/output/dir dbname 

在运行上面的代码之后,您将有一个tablename.sql文件包含每个表的schema(create table语句)和包含数据的tablename.txt文件。

如果您只需要一个模式转储,请添加–no-data标志:

 mysqldump --user=dbuser --password --no-data --tab=~/output/dir dbname 

这是一个将表格数据作为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" 

你可以做到这一点

  1. 获取mysql中的数据库列表
  2. 使用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 

这是相应的导入。

 #!/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'" 
 #!/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 

它看起来每个人在这里忘了autocommit=0;SET unique_checks=0;SET foreign_key_checks=0; 那是假设加快import的过程…

 #!/bin/bash MYSQL_USER="USER" MYSQL_PASS="PASS" if [ -z "$1" ] then echo "Dumping all DB ... in separate files" for I in $(mysql -u $MYSQL_USER --password=$MYSQL_PASS -e 'show databases' -s --skip-column-names); do echo "SET autocommit=0;SET unique_checks=0;SET foreign_key_checks=0;" > "$I.sql" mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $I >> "$I.sql"; echo "SET autocommit=1;SET unique_checks=1;SET foreign_key_checks=1;commit;" >> "$I.sql" gzip "$I.sql" done echo "END." else echo "Dumping $1 ..." echo "SET autocommit=0;SET unique_checks=0;SET foreign_key_checks=0;" > "$1.sql" mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $1 >> "$1.sql"; echo "SET autocommit=1;SET unique_checks=1;SET foreign_key_checks=1;commit;" >> "$1.sql" gzip "$1.sql" fi 

我不bash主,但我只是用bash脚本来做。 如果不知道MySQL,只要知道数据目录和数据库名称,就可以扫描所有的.frm文件(对于该数据库/目录中的每个表)。

我敢肯定,有办法让它变得更轻松,接受争论或什么,但是这对我来说很好。

tables_in_a_db_to_sql.sh

 #!/bin/bash database="this_is_my_database" datadir="/var/lib/mysql/" datadir_escaped="\/var\/lib\/mysql\/" all_tables=($(ls $datadir$database/*.frm | sed s/"$datadir_escaped$database\/"/""/g | sed s/.frm//g)) for t in "${all_tables[@]}"; do outfile=$database.$t.sql echo "-- backing up $t to $outfile" echo "mysqldump [options] $database $t > $outfile" # mysqldump [options] $database $t > $outfile done 

根据需要填写[options]和所需的outfile约定,并取消注释最后一个mysqldump行。

参见Pauli Marcus的以下文章:

如何将SQL数据库转储分解为表格式文件

将包含整个数据库的sql文件拆分为每个表文件是非常容易的:对于任何发生DROP TABLE的情况,请input.sql。 从包含在DROP TABLE语句中的表名生成文件名。 将输出回送到文件。 这是一个需要一个.sql文件作为input的小脚本:

 #!/bin/bash file=$1 # the input file directory="$file-splitted" # the output directory output="$directory/header" # the first file containing the header GREP="DROP TABLE" # what we are looking for mkdir $directory # create the output directory while read line do # if the current line contains the wanted statement if [ $(echo "$line" | grep -c "$GREP") == "1" ] then # extract the file name myfile=$(echo $line | awk '{print $5}' | sed -e 's/`//g' -e 's/;//g') # set the new file name output="$directory/$myfile" fi echo "$line" >> $output # write to file done < $file