如何用 mysqldump 转储数据库中每个表的最后 10 行?

如何用 mysqldump 转储数据库中每个表的最后 10 行?

我已经看到很多关于“如何从数据库的表中转储最后‘n’行”的文章。

例如: mysqldump --user=superman --password=batman --host=gothamcity.rds.com --where="1=1 ORDER BY id DESC LIMIT 10" DB_NAME TABLE_NAME ./path/to/dump/file.sql从这些答案中可以看出堆栈溢出服务器故障

但是,我如何告诉 mysqldump 导出数据库中每个表的最后‘n’行?

答案1

您可以使用类似下面的代码片段来获取数据库中表的列表,该代码片段提供没有任何标题或格式的列表。

mysql --user=superman --password=batman --host=gothamcity.rds.com --silent  joker.db -B -e "show tables"

Penguin
LexLuthor
Brainiac
CatWoman

所以现在您知道如何获取表格列表,将其输入循环并执行任何您想做的事情就很简单了。

答案2

我为此任务编写了一个脚本,以便mysqldump与 Bacula/Bareos 集成:

#!/bin/bash

CLIENT_CONFIG_PATH="${1}"
DUMP_DIR="${2}"
DUMP_FILENAME_SUFFIX='.sql'
declare -i COMPRESS_BZIP2=${3:-1}

PATH="/usr/bin:${PATH}"

declare -i EXIT_STATUS=1

if ! [ -n "${CLIENT_CONFIG_PATH}" ]; then
        echo "ERROR: missing argument #1 - mysql client config path" >&2
        exit 1
fi
if ! [ -f "${CLIENT_CONFIG_PATH}" ]; then
        echo "ERROR: no such file '${CLIENT_CONFIG_PATH}'" >&2
        exit 1
fi

if ! [ -n "${DUMP_DIR}" ]; then
        echo "ERROR: missing argument #2 - dump dir path" >&2
        exit 1
fi
if ! [ -d "${DUMP_DIR}" ]; then
        echo "ERROR: no such dir '${DUMP_DIR}'" >&2
        exit 1
fi

TABLES_LIST_FILE=$(mktemp)
mysql --defaults-file="${CLIENT_CONFIG_PATH}" --batch --no-auto-rehash --skip-column-names --execute='SELECT DISTINCT `table_schema` FROM `information_schema`.`tables` WHERE `table_schema` NOT IN ("information_schema","performance_schema");' >"${TABLES_LIST_FILE}"
for T_DBNAME in $(cat ${TABLES_LIST_FILE}); do
        if [ -n "${T_DBNAME}" ]; then
                    T_DUMPFILE="${DUMP_DIR}/${T_DBNAME}${DUMP_FILENAME_SUFFIX}"
                    echo "Dumping database: '${T_DBNAME}' to file: '${T_DUMPFILE}' ..." >&2
                    mysqldump --defaults-file="${CLIENT_CONFIG_PATH}" --force --hex-blob --databases "${T_DBNAME}" 1>"${T_DUMPFILE}" &
        fi
done
while [ $(jobs -p |wc -l) -gt 0 ]; do
        wait -n
        if [ ${?} -eq 0 ]; then
                    EXIT_STATUS=0
        fi
done

if [ ${COMPRESS_BZIP2} -gt 0 ]; then
        bzip2 --best --force --verbose "${DUMP_DIR}"/*"${DUMP_FILENAME_SUFFIX}"
fi

exit ${EXIT_STATUS}

你应该这样称呼它: mysqldump-per-db.sh CLIENT_CONFIG TEMP_DIR COMPRESS_BZIP

参数:

CLIENT_CONFIG - 替换包含主机、凭证和转储选项的 MySQL 配置文件。

TEMP_DIR - 转储文件的临时目录,每个数据库一个。

COPRESS_BZIP - 0 或 1

答案3

如果您可以使用“xargs”,那么这些都可以合并为一个命令。它将从 mysql 命令中获取表名列表并将其输入到 mysqldump 命令中:

mysql --user=superman --password=batman \
    --host=gothamcity.rds.com --port=3306 --database=jokersbox \
    --silent --batch --execute="show tables" | \
    xargs -I {} mysqldump --user=superman --password=batman --host=gothamcity.rds.com \
    --where="1=1 ORDER BY id DESC LIMIT 10" \
    --no-create-info jokersbox {}  >> ./path/to/dump/file.sql

我添加了 --no-create-info 并使用了附加 ('>>') 而不是覆盖 ('>')。这些更改可能不适合您想要对 sql 文件执行的操作。

答案4

这是我在终端中执行的操作。基本思路是获取所有表名的列表,然后将其导入 bash 中的 while 循环,其中每个表都单独转储到单独的转储文件中。

mysql --user=superman --password=batman --host=gothamcity.rds.com --port=3306 --database=jokersbox --execute="show tables" --silent --batch | while read tablename ; do mysqldump --user=superman --password=batman --host=gothamcity.rds.com --port=3306 --where="1=1 ORDER BY id DESC LIMIT 10" jokersbox $tablename --add-drop-table > $tablename.sql ; done

它成功了。唯一的问题是,它将每个表转储到其自己的单独 SQL 文件中 - 并非所有表都转储到单个文件中。但我猜想这些单个文件的内容也可以通过其他一些 bash 命令合并到单个文件中。

编辑:::您可以使用>>运算符而不是>运算符将每个 mysqldump 附加到单个文件,而不是用最后一个 mysqldump 覆盖文件。如果您选择使用,>>则必须确保写入固定文件名(如dumps.sql),而不是写入动态文件名(如$tablename.sql)。您还必须确保dumps.sql在运行脚本之前不存在任何文件 - 否则,您的 mysqldump 将附加到已包含其他内容的文件中。

相关内容