先将阿里云RDS备份下载下来,注意是逻辑备份

下载完成是一个.tar文件。

原RDS的数据库版本为MySQL5.5.18,恢复数据库版本是MariaDB

#!/bin/bash

set -euo pipefail

# 检查参数
if [ $# -lt 1 ]; then
    echo "Usage: $0 backup.tar"
    exit 1
fi

BACKUP_TAR="$1"
WORKDIR="restore_tmp"

# 清理旧目录
rm -rf "$WORKDIR"
mkdir -p "$WORKDIR"

echo "======================================"
echo "Extracting: $BACKUP_TAR"
echo "======================================"

tar -xvf "$BACKUP_TAR" -C "$WORKDIR"

cd "$WORKDIR" || exit 1

# 输入一次密码
read -s -p "Enter MariaDB root password: " DBPASS
echo

export MYSQL_PWD="$DBPASS"

echo "======================================"
echo "Start restoring..."
echo "======================================"

for f in *.sql.gz; do
    [ -f "$f" ] || continue

    db=$(echo "$f" | sed 's/_datafull_.*//')

    echo ""
    echo "--------------------------------------"
    echo "File     : $f"
    echo "Database : $db"
    echo "--------------------------------------"

    echo "Dropping old database..."
    mysql -u root -e "DROP DATABASE IF EXISTS \`$db\`;"

    echo "Creating database..."
    mysql -u root -e "CREATE DATABASE \`$db\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"

    echo "Importing data..."

    (
        echo "SET sql_mode='';"
        echo "SET NAMES utf8mb4;"
        echo "SET FOREIGN_KEY_CHECKS=0;"
        gunzip -c "$f"
        echo "SET FOREIGN_KEY_CHECKS=1;"
    ) | mysql -u root "$db" --force || {
        echo "ERROR: $db restore failed"
        continue
    }

    echo "OK: $db restored"
done

unset MYSQL_PWD

echo ""
echo "======================================"
echo "ALL DATABASES RESTORED"
echo "======================================"

 


把脚本保存成文件

nano restore.sh

Ctrl + O,回车,Ctrl + X

给脚本执行权限

chmod +x restore.sh

运行脚本

sudo ./restore.sh 你的tar文件名

备份整个MariaDB

mariadb-dump -u root -p --all-databases > alldb.sql

也可以压缩备份

mariadb-dump -u root -p --all-databases | gzip > alldb.sql.gz

下面是单独提供一个只导入.sql的备份脚本

#!/bin/bash

set -euo pipefail

# ======================================
# Alibaba Cloud RDS(MySQL5.7)
# -> Ubuntu 22.04 MariaDB Restore Script
# (SQL only version)
# ======================================

# 检查参数
if [ $# -lt 1 ]; then
    echo "Usage: $0 backup.sql"
    exit 1
fi

BACKUP_SQL="$1"

if [ ! -f "$BACKUP_SQL" ]; then
    echo "File not found: $BACKUP_SQL"
    exit 1
fi

WORKDIR="restore_tmp"

# 清理旧目录
rm -rf "$WORKDIR"
mkdir -p "$WORKDIR"

echo "======================================"
echo "Using SQL file: $BACKUP_SQL"
echo "======================================"

# 直接复制一份到工作目录(避免污染原文件)
cp "$BACKUP_SQL" "$WORKDIR/"
cd "$WORKDIR" || exit 1

SQL_FILE=$(basename "$BACKUP_SQL")

# 输入一次密码
read -s -p "Enter MariaDB root password: " DBPASS
echo

export MYSQL_PWD="$DBPASS"

echo "======================================"
echo "Start restoring..."
echo "======================================"

# 从文件名推数据库名
db=$(echo "$SQL_FILE" | sed 's/_datafull_.*//; s/\.sql$//')

echo ""
echo "--------------------------------------"
echo "File     : $SQL_FILE"
echo "Database : $db"
echo "--------------------------------------"

TMP_SQL="patched_${SQL_FILE}"

echo "Patching MySQL5.7 -> MariaDB compatibility..."

cp "$SQL_FILE" "$TMP_SQL"

# ===== 兼容修复 =====

# ROW_FORMAT 修复
sed -i 's/ROW_FORMAT=COMPACT/ROW_FORMAT=DYNAMIC/g' "$TMP_SQL"

# collation 修复
sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_general_ci/g' "$TMP_SQL"

# 删除 DEFINER
sed -i 's/DEFINER=`[^`]*`@`[^`]*`//g' "$TMP_SQL"

echo "Dropping old database..."
mysql -u root -e "DROP DATABASE IF EXISTS \`$db\`;"

echo "Creating database..."
mysql -u root -e "
    CREATE DATABASE \`$db\`
    DEFAULT CHARACTER SET utf8mb4
    COLLATE utf8mb4_general_ci;
"

echo "Importing data..."

(
    echo "SET sql_mode='NO_ENGINE_SUBSTITUTION';"
    echo "SET NAMES utf8mb4;"
    echo "SET FOREIGN_KEY_CHECKS=0;"
    cat "$TMP_SQL"
    echo "SET FOREIGN_KEY_CHECKS=1;"
) | mysql -u root "$db" --force --binary-mode=1 || {
    echo "ERROR: $db restore failed"
    rm -f "$TMP_SQL"
    exit 1
}

echo "Cleaning temp file..."
rm -f "$TMP_SQL"

unset MYSQL_PWD

echo ""
echo "======================================"
echo "RESTORE COMPLETED"
echo "======================================"

使用方法一样,先保存到.sh文件,然后设置运行权限,接着执行即可

chmod +x restore.sh

./restore.sh backup.sql

 

另外还提供支持MySQL5.7的脚本,导入单个.sql

#!/bin/bash

set -euo pipefail

if [ $# -lt 1 ]; then
    echo "Usage: $0 backup.sql"
    exit 1
fi

BACKUP_SQL="$1"

WORKDIR="restore_tmp"
rm -rf "$WORKDIR"
mkdir -p "$WORKDIR"

cp "$BACKUP_SQL" "$WORKDIR/"
cd "$WORKDIR" || exit 1

SQL_FILE=$(basename "$BACKUP_SQL")

read -s -p "Enter MySQL 5.7 root password: " DBPASS
echo

export MYSQL_PWD="$DBPASS"

db=$(echo "$SQL_FILE" | sed 's/_datafull_.*//; s/\.sql$//')

TMP_SQL="patched_${SQL_FILE}"

cp "$SQL_FILE" "$TMP_SQL"

echo "Patching for MySQL 5.7..."

# ===== MySQL 5.7 兼容修复 =====

sed -i 's/DEFINER=`[^`]*`@`[^`]*`//g' "$TMP_SQL"
sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_general_ci/g' "$TMP_SQL"
sed -i 's/ROW_FORMAT=COMPACT/ROW_FORMAT=DYNAMIC/g' "$TMP_SQL"

mysql -u root -e "DROP DATABASE IF EXISTS \`$db\`;"

mysql -u root -e "
CREATE DATABASE \`$db\`
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
"

(
    echo "SET sql_mode='NO_ENGINE_SUBSTITUTION';"
    echo "SET NAMES utf8mb4;"
    echo "SET FOREIGN_KEY_CHECKS=0;"
    cat "$TMP_SQL"
    echo "SET FOREIGN_KEY_CHECKS=1;"
) | mysql -u root "$db" --force --binary-mode=1

rm -f "$TMP_SQL"
unset MYSQL_PWD

echo "RESTORE DONE (MySQL 5.7)"

另外还提供支持MySQL5.7的脚本,批量导入.tar备份

#!/bin/bash

set -euo pipefail

if [ $# -lt 1 ]; then
    echo "Usage: $0 backup.tar"
    exit 1
fi

BACKUP_TAR="$1"

if [ ! -f "$BACKUP_TAR" ]; then
    echo "File not found: $BACKUP_TAR"
    exit 1
fi

WORKDIR="restore_tmp"

rm -rf "$WORKDIR"
mkdir -p "$WORKDIR"

echo "======================================"
echo "Extracting TAR: $BACKUP_TAR"
echo "======================================"

tar -xf "$BACKUP_TAR" -C "$WORKDIR"

cd "$WORKDIR" || exit 1

read -s -p "Enter MySQL 5.7 root password: " DBPASS
echo
export MYSQL_PWD="$DBPASS"

echo ""
echo "======================================"
echo "Start restoring all databases..."
echo "======================================"

for f in *.sql.gz; do

    [ -f "$f" ] || continue

    # =========================
    # 数据库名解析
    # =========================
    db=$(echo "$f" | sed 's/_datafull_.*//')

    echo ""
    echo "--------------------------------------"
    echo "File     : $f"
    echo "Database : $db"
    echo "--------------------------------------"

    TMP_SQL="${f%.gz}"

    echo "Decompressing..."
    gunzip -c "$f" > "$TMP_SQL"

    echo "Patching for MySQL 5.7..."

    # =========================
    # MySQL 5.7 兼容修复
    # =========================
    sed -i 's/DEFINER=`[^`]*`@`[^`]*`//g' "$TMP_SQL"
    sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_general_ci/g' "$TMP_SQL"
    sed -i 's/ROW_FORMAT=COMPACT/ROW_FORMAT=DYNAMIC/g' "$TMP_SQL"

    echo "Dropping database..."
    mysql -u root -e "DROP DATABASE IF EXISTS \`$db\`;"

    echo "Creating database..."
    mysql -u root -e "
        CREATE DATABASE \`$db\`
        DEFAULT CHARACTER SET utf8mb4
        COLLATE utf8mb4_general_ci;
    "

    echo "Importing..."

    (
        echo "SET sql_mode='NO_ENGINE_SUBSTITUTION';"
        echo "SET NAMES utf8mb4;"
        echo "SET FOREIGN_KEY_CHECKS=0;"
        cat "$TMP_SQL"
        echo "SET FOREIGN_KEY_CHECKS=1;"
    ) | mysql -u root "$db" --force --binary-mode=1 || {
        echo "ERROR: $db restore failed"
        rm -f "$TMP_SQL"
        continue
    }

    rm -f "$TMP_SQL"

    echo "OK: $db restored"

done

unset MYSQL_PWD

echo ""
echo "======================================"
echo "ALL DONE"
echo "======================================"

 

如果想备份整个MySQL数据库(逻辑备份)

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

也可以压缩备份

mysqldump -u root -p --all-databases | gzip > alldb.sql.gz

备份整个MariaDB

mariadb-dump -u root -p --all-databases > alldb.sql

也可以压缩备份

mariadb-dump -u root -p --all-databases | gzip > alldb.sql.gz