默认情况下,mysqldump对整个数据库进行备份。我需要在MySQL中备份一个表。这可能吗?我怎么恢复它?


当前回答

我遇到了这个问题,想用我们完整的例子来扩展其他人的答案:

这将在它自己的文件中备份模式,然后在它自己的文件中备份每个数据库表。

日期格式意味着您可以在硬盘空间允许的情况下尽可能频繁地运行此程序。


DATE=`date '+%Y-%m-%d-%H'`
BACKUP_DIR=backups/
DATABASE_NAME=database_name
mysqldump --column-statistics=0  --user=fake --password=secure --host=10.0.0.1  --routines --triggers --single-transaction --no-data --databases ${DATABASE_NAME} | gzip > ${BACKUP_DIR}${DATE}-${DATABASE_NAME}--schema.sql.gz
for table in $(mysql  --user=fake --password=secure --host=10.0.0.1 -AN -e "SHOW TABLES FROM ${DATABASE_NAME};");
    do
    echo ""
    echo ""
    echo "mysqldump --column-statistics=0  --user=fake --password=secure --host=10.0.0.1 --routines --triggers --single-transaction --databases ${DATABASE_NAME} --tables ${table} | gzip > ${BACKUP_DIR}${DATE}-${DATABASE_NAME}-${table}.sql.gz"
    mysqldump --column-statistics=0  --user=fake --password=secure --host=10.0.0.1 --routines --triggers --single-transaction --databases ${DATABASE_NAME} --tables ${table} | gzip > ${BACKUP_DIR}${DATE}-${DATABASE_NAME}-${table}.sql.gz
done

我们以bash脚本的形式每小时运行一次,实际上有HOUR检查,白天只备份一些表,晚上备份所有表。

为了在驱动器上保留一些空间,脚本还运行此命令删除超过X天的备份。

# HOW MANY DAYS SHOULD WE KEEP
DAYS_TO_KEEP=25
DAYSAGO=$(date --date="${DAYS_TO_KEEP} days ago" +"%Y-%m-%d-%H")
echo $DAYSAGO
rm -Rf ${BACKUP_DIR}${DAYSAGO}-*
echo "rm -Rf ${BACKUP_DIR}${DAYSAGO}-*"

其他回答

我遇到了这个问题,想用我们完整的例子来扩展其他人的答案:

这将在它自己的文件中备份模式,然后在它自己的文件中备份每个数据库表。

日期格式意味着您可以在硬盘空间允许的情况下尽可能频繁地运行此程序。


DATE=`date '+%Y-%m-%d-%H'`
BACKUP_DIR=backups/
DATABASE_NAME=database_name
mysqldump --column-statistics=0  --user=fake --password=secure --host=10.0.0.1  --routines --triggers --single-transaction --no-data --databases ${DATABASE_NAME} | gzip > ${BACKUP_DIR}${DATE}-${DATABASE_NAME}--schema.sql.gz
for table in $(mysql  --user=fake --password=secure --host=10.0.0.1 -AN -e "SHOW TABLES FROM ${DATABASE_NAME};");
    do
    echo ""
    echo ""
    echo "mysqldump --column-statistics=0  --user=fake --password=secure --host=10.0.0.1 --routines --triggers --single-transaction --databases ${DATABASE_NAME} --tables ${table} | gzip > ${BACKUP_DIR}${DATE}-${DATABASE_NAME}-${table}.sql.gz"
    mysqldump --column-statistics=0  --user=fake --password=secure --host=10.0.0.1 --routines --triggers --single-transaction --databases ${DATABASE_NAME} --tables ${table} | gzip > ${BACKUP_DIR}${DATE}-${DATABASE_NAME}-${table}.sql.gz
done

我们以bash脚本的形式每小时运行一次,实际上有HOUR检查,白天只备份一些表,晚上备份所有表。

为了在驱动器上保留一些空间,脚本还运行此命令删除超过X天的备份。

# HOW MANY DAYS SHOULD WE KEEP
DAYS_TO_KEEP=25
DAYSAGO=$(date --date="${DAYS_TO_KEEP} days ago" +"%Y-%m-%d-%H")
echo $DAYSAGO
rm -Rf ${BACKUP_DIR}${DAYSAGO}-*
echo "rm -Rf ${BACKUP_DIR}${DAYSAGO}-*"

从.sql中转储和恢复单个表

Dump

mysqldump db_name table_name > table_name.sql

从远程数据库转储

mysqldump -u <db_username> -h <db_host> -p db_name table_name > table_name.sql

如需进一步参考:

http://www.abbeyworkshop.com/howto/lamp/MySQL_Export_Backup/index.html

恢复

mysql -u <user_name> -p db_name
mysql> source <full_path>/table_name.sql

或者在一行里

Mysql -u username -p db_name < /path/to/table_name.sql . Mysql


从压缩(.sql.gz)格式转储和恢复单个表

资料来源:John McGrath

Dump

mysqldump db_name table_name | gzip > table_name.sql.gz

恢复

gunzip < table_name.sql.gz | mysql -u username -p db_name

只需使用mysqldump -u根数据库表 或者如果使用mysqldump密码-u root -p pass数据库表

我们可以在任何给定条件下对任何特定的表进行mysql转储,如下所示

mysqldump -uusername -p -hhost databasename tablename --skip-lock-tables

如果我们想在表上添加一个特定的where条件,那么我们可以使用下面的命令

mysqldump -uusername -p -hhost databasename tablename --where="date=20140501" --skip-lock-tables

try

for line in $(mysql -u... -p... -AN -e "show tables from NameDataBase");
do 
mysqldump -u... -p.... NameDataBase $line > $line.sql ; 
done

$line内容名称表;)