一次性导出和导入所有MySQL数据库

问题描述 投票:0回答:15

我想保留所有 MySQL 数据库的备份。我有超过 100 个 MySQL 数据库。我想同时导出所有这些,然后再次将它们全部导入到我的 MySQL 服务器中。我怎样才能做到这一点?

mysql database restore database-backups mysql-backup
15个回答
958
投票

出口:

mysqldump -u root -p --all-databases > alldb.sql

查找 mysqldump 的文档。您可能想使用评论中提到的一些选项:

mysqldump -u root -p --opt --all-databases > alldb.sql
mysqldump -u root -p --all-databases --skip-lock-tables > alldb.sql

进口:

mysql -u root -p < alldb.sql

259
投票

其他解决方案:

它将每个数据库备份到不同的文件中

#!/bin/bash

USER="zend"
PASSWORD=""
#OUTPUT="/Users/rabino/DBs"

#rm "$OUTPUTDIR/*gz" > /dev/null 2>&1

databases=`mysql -u $USER -p$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database`

for db in $databases; do
    if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]] ; then
        echo "Dumping database: $db"
        mysqldump -u $USER -p$PASSWORD --databases $db > `date +%Y%m%d`.$db.sql
       # gzip $OUTPUT/`date +%Y%m%d`.$db.sql
    fi
done

46
投票

我在这个问题上看到的所有答案都可能在某些数据库中存在字符集问题,因为将

mysqldump
的退出重定向到shell操作符
>
中的文件的问题。

要解决此问题,您应该使用此命令行进行备份-r 标志与 shell 运算符

>
的作用相同,但没有字符集问题。

mysqldump -u root -p --opt --all-databases -r backup.sql

要在字符集没有任何问题的情况下完成良好的 BD 恢复,请使用这些命令(您可以根据需要更改默认字符集)。

mysql -uroot -p --default-character-set=utf8
mysql> SET names 'utf8';
mysql> SOURCE backup.sql;

14
投票

我已经在四年多前写了这条评论,现在决定做出回答。

来自 jruzafascript 可以稍微简化一下:

#!/bin/bash

USER="zend"
PASSWORD=""
ExcludeDatabases="Database|information_schema|performance_schema|mysql"
databases=`mysql -u $USER -p$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | egrep -v $ExcludeDatabases`

for db in $databases; do
    echo "Dumping database: $db"
    mysqldump -u $USER -p$PASSWORD --databases $db > `date +%Y%m%d`.$db.sql
done

注:

  1. 排除的数据库(通常是系统表)在变量中提供
    ExcludeDatabases
  2. 请注意,密码是在命令行中提供的。这被认为是不安全的。研究这个问题

13
投票

根据这些答案,我制作了一个脚本,将所有数据库备份到单独的文件中,然后将它们压缩到一个以日期为名称的存档中。

这不会要求输入密码,可以在 cron 中使用。要将密码存储在

.my.cnf
中,请检查此答案 https://serverfault.com/a/143587/62749

还为那些不太熟悉 bash 脚本的人提供了注释。

#!/bin/bash

# This script will backup all mysql databases into 
# compressed file named after date, ie: /var/backup/mysql/2016-07-13.tar.bz2

# Setup variables used later

# Create date suffix with "F"ull date format
suffix=$(date +%F)
# Retrieve all database names except information schemas. Use sudo here to skip root password.
dbs=$(sudo mysql --defaults-extra-file=/root/.my.cnf --batch --skip-column-names -e "SHOW DATABASES;" | grep -E -v "(information|performance)_schema")
# Create temporary directory with "-d" option
tmp=$(mktemp -d)
# Set output dir here. /var/backups/ is used by system, 
# so intentionally used /var/backup/ for user backups.
outDir="/var/backup/mysql"
# Create output file name
out="$outDir/$suffix.tar.bz2"

# Actual script

# Check if output directory exists
if [ ! -d "$outDir" ];then
  # Create directory with parent ("-p" option) directories
  sudo mkdir -p "$outDir"
fi

# Loop through all databases
for db in $dbs; do
  # Dump database to temporary directory with file name same as database name + sql suffix
  sudo mysqldump --defaults-extra-file=/root/.my.cnf --databases "$db" > "$tmp/$db.sql"
done

# Go to tmp dir
cd $tmp

# Compress all dumps with bz2, discard any output to /dev/null
sudo tar -jcf "$out" * > "/dev/null"

# Cleanup
cd "/tmp/"
sudo rm -rf "$tmp"

10
投票

为什么要解析格式化的输出,而mysql命令可以直接做你想要的事情?

databases=`mysql -u $USER -p$PASSWORD --batch --skip-column-names -e "SHOW DATABASES;" | grep -E -v "(information|performance)_schema"`

仅列出数据库名称。


4
投票

当您转储所有数据库时。显然它拥有大量数据。所以你可以选择以下更好:

创建备份:

mysqldump -u [user] -p[password]--single-transaction --quick --all-databases | gzip > alldb.sql.gz

如有错误

-- 警告:跳过表 mysql.event 的数据。明确指定 --events 选项。

用途:

mysqldump -u [user] -p --events --single-transaction --quick --all-databases | gzip > alldb.sql.gz

恢复备份:

gunzip < alldb.sql.gz | mysql -u [user] -p[password]

希望能有所帮助:)


3
投票

从不同的 MySQL 版本导出和导入时要小心,因为 mysql 表可能有不同的列。 如果您运气不好,授予权限可能会失败。 我创建了这个脚本(mysql_export_grants.sql)来转储导入到新数据库中的授权,以防万一:

#!/bin/sh
stty -echo
printf 'Password: ' >&2
read PASSWORD
stty echo
printf "\n"
if [ -z "$PASSWORD" ]; then
        echo 'No password given!'
        exit 1
fi
MYSQL_CONN="-uroot -p$PASSWORD"
mysql ${MYSQL_CONN} --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql ${MYSQL_CONN} --skip-column-names -A | sed 's/$/;/g'

3
投票

导出数据库:

要导出,您可以使用以下命令:

mysqldump -u root -p --all-databases > alldb.sql
              ↓                         ↓
         (your user name      (file name will be save)

实际上,我写这篇文章是因为没有理由将所有数据库备份在一个文件中,因为它可能会在导入时导致错误。例如,有一些默认的数据库,没有理由备份它们。

因此,您应该选择要备份的数据库。

mysqldump -u root -p --databases YourDBName1 YourDBName2 YourDBName3 > tutorials_query1.sql
                                     ↓            ↓            ↓
                             (your databases name that you want to backup)

您可以使用此命令获取所有数据库的名称:

sudo mysql -u root -p

输入您的密码,然后在

mysql>
前面运行以下命令:

SHOW DATABASES;

导入数据库:

mysql -u root -p < alldb.sql
           ↓            ↓
  (your username)   (it can be the full path like "/home/yoursqlfile.sql")

1
投票

导出 Ubuntu 中的所有数据库

1 -

mysqldump -u root -p --databases database1 database2 > ~/Desktop/databases_1_2.sql

2 -

mysqldump -u root -p --all_databases > ~/Desktop/all_databases.sql

enter image description here


0
投票

mysqldump -uroot -proot --all-databases > allDB.sql

注意:-u“您的用户名” -p“你的密码”


0
投票

下面的脚本将数据库一一导出和导入,并在导入后不断删除sql文件。 [https://gist.github.com/Shubhamnegi/83b42c4ce80dbc9104c0f9413be17701][1]


0
投票

我使用此命令成功导出了所有数据库。

.\mysqldump -u root -p --all-databases > D:\laragon\tmp\alldb.sql

我的工具:Xampp、Windows Powershell


0
投票

例如,您将所有数据库的架构和数据导出到

backup.sql
,如下所示。 *我的回答详细解释了如何导出所有数据库的模式和数据:

mysqldump -u john -p -A > backup.sql

然后,运行上面的命令后需要输入密码:

Enter password:

现在,您可以使用

backup.sql
一次性恢复所有数据库,而无需一一选择数据库,如下所示。 *我的回答详细解释了如何导入所有数据库的架构和数据:

mysql -u john -p < backup.sql

然后,运行上面的命令后需要输入密码:

Enter password:

或者,登录后,您可以使用

backup.sql
\.
source
一次性恢复所有数据库,而不需要一一选择数据库,如下所示:

mysql -u john -p
...
mysql> \. backup.sql

或者:

mysql -u john -p
...
mysql> source backup.sql

0
投票

这个答案有点晚了,但这个脚本可能会有所帮助,也从其他答案中得到了改进。

#!/usr/bin/env bash

MYSQL_CONN="-uroot"
MYSQL_CONF="--add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset --insert-ignore --routines"
TARGET_PATH="/root/backup/"
#BUCKET_NAME="web"
TIMESTAMP=`date +%Y%m%d`
FILENAME="BACKUP-${TIMESTAMP}"

cd ${TARGET_PATH} || exit;

echo "Dumping database: mysql with users"
mysqldump ${MYSQL_CONN} ${MYSQL_CONF} --system=all mysql | gzip > "db.sql.gz"

ExcludeDatabases="sys|tmp|information_schema|performance_schema|mysql|Database"
databases=$(mysql ${MYSQL_CONN} -e "SHOW DATABASES;" | tr -d "| " | egrep -v ${ExcludeDatabases})
for db in $databases; do
    echo "Dumping database: $db"
    mysqldump ${MYSQL_CONN} ${MYSQL_CONF} --databases "${db}" | gzip > "${db}-${TIMESTAMP}.sql.gz"
done

#- group db exports
zip -0 -q "db_${TIMESTAMP}_sql.zip" *.sql.gz;
rm *.sql.gz;
© www.soinside.com 2019 - 2024. All rights reserved.