在一个单独的文件中使用mysqldump进行数据库备份。

10 浏览
0 Comments

在一个单独的文件中使用mysqldump进行数据库备份。

我正在编写一条单行命令,将所有数据库备份到它们各自的名称中,而不是将所有数据库都导出到一个SQL文件中。例如:db1被保存为db1.sql,db2被保存为db2.sql。到目前为止,我已经收集到以下命令来检索所有数据库。

mysql -u用户名 -p密码 -e 'show databases' | grep -v 'Database'

我计划使用awk来执行类似以下的操作

awk '{mysqldump -u用户名 -p密码 $1 > $1.sql}'

但是这样不起作用。我对bash不熟悉,所以我的想法可能是错误的。

我该怎么做才能按照它们各自的名称导出数据库呢?

更新:

好的,终于通过下面的提示设法让它工作了。

这是最终的脚本

# 将[]替换为您自己的配置
# 将自己的目录替换为保存的目录
# echo不起作用。嗯...
mysql -u[用户名] -p'[密码]' -e "show databases" \
| grep -Ev 'Database|information_schema' \
| while read dbname; \
do \
echo '正在导出 $dbname' \
mysqldump -u[用户名] -p'[密码]' $dbname > ~/db_backup/$dbname.sql;\
done

不过,echo的部分不起作用。

0
0 Comments

mysqldump与db分开在一个单独的文件中的原因是为了提高备份的效率和可靠性。如果整个数据库备份在一个文件中,当其中一个表损坏时,整个备份都会受到影响。而将备份分别存储在不同的文件中,只会影响到该数据库,其他数据库仍然有效。

解决方法是使用mysqldump命令结合shell脚本来实现。首先创建一个只读的mysql用户'bupuser',并设置密码'Secret'。然后通过以下一行命令来备份数据库:

mysql -s -r -u bupuser -pSecret -e 'show databases' | while read db; do mysqldump -u bupuser -pSecret $db -r /var/db-bup/${db}.sql; [[ $? -eq 0 ]] && gzip /var/db-bup/${db}.sql; done

这行命令首先获取数据库列表,然后循环对每个数据库创建一个dump.sql文件存储在指定目录下(可以根据需要修改)。只有当没有出现错误时,才会对文件进行压缩,从而节省存储空间。如果遇到错误,只会生成.sql文件而不是.sql.qz文件。

为了避免备份系统表,可以在命令中添加GREP命令来过滤掉系统表:

mysql -s -r -u root -proot -e 'show databases' | grep -Ev 'Database|mysql|information_schema|phpmyadmin'| while read db; do mysqldump -u root -proot $db -r /var/www/html/${db}.sql; [[ $? -eq 0 ]] && gzip /var/www/html/${db}.sql; done

为了进一步改进,可以使用SQL语句来过滤数据库,而不需要使用GREP命令。可以将第一部分改成以下命令:

mysql -s -r -N -u bupuser -pSecret -e 'show databases where `Database` not in("information_schema"',"performance_schema","phpmyadmin")'

这个命令使用了SQL语句来排除指定的系统数据库,并且使用了-N选项来跳过列名。尽管可以备份系统数据库本身,但是排除它们可能会更好。

至于问题中提到的bup工具,具体的使用方法和恢复文件的过程没有给出进一步的细节,所以无法回答相关问题。但是可以推测,bup可能是用来保存已经压缩的备份文件,恢复文件可能需要使用对应的解压缩工具进行操作。

0
0 Comments

问题出现的原因是在使用mysqldump命令时,出现了"mysqldump: Got error: 1049: Unknown database 'Database' when selecting the database"的错误。这个错误的原因是在使用mysql命令时,没有指定要导出的数据库的名称。

解决方法是在使用mysqldump命令之前,先使用mysql命令查询所有的数据库,并将结果传递给while循环。在循环中,使用mysqldump命令导出每个数据库到一个单独的文件中。这样就可以避免上述错误的出现。

以下是解决方法的代码示例:

mysql -uroot -N -e 'show databases' | while read dbname; do mysqldump -uroot --complete-insert --some-other-options "$dbname" > "$dbname".sql; done

在上述代码中,通过使用mysql命令的"-N"选项来忽略列头"Database",然后将结果传递给while循环。循环中使用mysqldump命令导出每个数据库到一个以数据库名称命名的.sql文件中。

另外,需要注意的是,为了避免在命令历史记录中泄露数据库密码,建议在每个"-uroot"后面添加"-pPassword_without_space_after_-p"的选项。

希望以上内容能够帮助解决使用mysqldump命令导出数据库时出现的错误。

0
0 Comments

通过上述脚本可以实现以下功能:

- 将所有数据库进行备份,并压缩输出,命名为数据库名.sql.gz

- 使用[autocommit/unique_checks/foreign_key_checks]来加快导入速度

- 排除默认的数据库

脚本如下:

#!/bin/bash
MYSQL_USER="root"
MYSQL_PASS="YOUR_PASS"
echo "-- START --"
echo "SET autocommit=0;SET unique_checks=0;SET foreign_key_checks=0;" > tmp_sqlhead.sql
echo "SET autocommit=1;SET unique_checks=1;SET foreign_key_checks=1;" > tmp_sqlend.sql
if [ -z "$1" ]
  then
    echo "-- Dumping all DB ..."
    for I in $(mysql -u $MYSQL_USER --password=$MYSQL_PASS -e 'show databases' -s --skip-column-names); 
    do
      if [ "$I" = information_schema ] || [ "$I" =  mysql ] || [ "$I" =  phpmyadmin ] || [ "$I" =  performance_schema ]  # 排除这些数据库
      then
         echo "-- Skip $I ..."
       continue
      fi
      echo "-- Dumping $I ..."
      # 使用管道将头部和尾部与mysqldump的输出合并,并进行压缩
      mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $I | cat tmp_sqlhead.sql - tmp_sqlend.sql | gzip -fc > "$I.sql.gz" 
    done
else
      I=$1;
      echo "-- Dumping $I ..."
      # 使用管道将头部和尾部与mysqldump的输出合并,并进行压缩
      mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $I | cat tmp_sqlhead.sql - tmp_sqlend.sql | gzip -fc > "$I.sql.gz" 
fi
# 删除临时文件
rm tmp_sqlhead.sql
rm tmp_sqlend.sql
echo "-- FINISH --"

该脚本的出现原因是为了方便备份所有数据库,并在备份过程中排除默认的数据库。通过设置autocommit、unique_checks和foreign_key_checks,可以加快导入速度。脚本的解决方法是使用mysqldump命令备份数据库,并使用gzip命令进行压缩。同时,使用管道将头部和尾部与mysqldump的输出合并,生成最终的备份文件。通过循环遍历所有数据库,可以备份所有数据库并生成对应的压缩文件。

0