![如何用 mysqldump 转储数据库中每个表的最后 10 行?](https://linux22.com/image/671252/%E5%A6%82%E4%BD%95%E7%94%A8%20mysqldump%20%E8%BD%AC%E5%82%A8%E6%95%B0%E6%8D%AE%E5%BA%93%E4%B8%AD%E6%AF%8F%E4%B8%AA%E8%A1%A8%E7%9A%84%E6%9C%80%E5%90%8E%2010%20%E8%A1%8C%EF%BC%9F.png)
答案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 将附加到已包含其他内容的文件中。