You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

将rsync输出写入MySQL数据库时丢失格式问题求助

解决rsync日志插入MySQL丢失格式的问题

嘿,我来帮你搞定这个头疼的小问题!你遇到的情况其实很常见——终端能正常显示换行、空格和制表符,但插入MySQL后这些格式就消失了,核心原因是特殊字符没有被正确转义,MySQL把它们当成了SQL语句的空白分隔符,而不是字符串的一部分。

下面给你两种靠谱的解决方案,你可以根据自己的脚本情况选择:

方案一:转义rsync输出中的特殊字符

在把rsync输出插入数据库前,先对换行符(\n)、制表符(\t)和单引号(')做转义处理,确保MySQL能识别它们是字符串的一部分。

修改你的脚本步骤:

  1. 先捕获rsync的输出,然后用sed完成转义:
# 捕获rsync的标准输出和错误输出
RSYNC_OUTPUT=$(rsync -av /你的源路径/ /你的目标路径/ 2>&1)

# 转义特殊字符:替换单引号为\',换行为\n,制表符为\t
ESCAPED_OUTPUT=$(echo "$RSYNC_OUTPUT" | sed -e "s/'/\\'/g" -e 's/\n/\\n/g' -e 's/\t/\\t/g')
  1. 插入数据库时使用转义后的变量:
# 假设你的表结构包含log_date, log_time, content三个字段
mysql -u 你的用户名 -p'你的密码' -D 你的数据库名 <<EOF
INSERT INTO 你的表名 (log_date, log_time, content)
VALUES ('$DATUM', '$IDO', '$ESCAPED_OUTPUT');
EOF

方案二:直接用日志文件导入数据库(更高效)

你本来就把rsync输出写到了日志文件里,不如直接用MySQL的LOAD DATA INFILE命令导入,这样既保留格式,又避免了转义的麻烦:

  1. 确保rsync日志已经正确写入文件(你脚本里的LOG_FAJL部分):
rsync -av /你的源路径/ /你的目标路径/ 2>&1 > "$LOG_FAJL"
  1. 用LOAD DATA命令导入文件到数据库:
mysql -u 你的用户名 -p'你的密码' -D 你的数据库名 -e "
LOAD DATA LOCAL INFILE '$LOG_FAJL' 
INTO TABLE 你的表名 
FIELDS TERMINATED BY ''  # 因为日志是纯文本,没有字段分隔符
LINES TERMINATED BY '\n'
(content)  # 指定导入到content字段
SET log_date='$DATUM', log_time='$IDO';  # 手动设置日期和时间字段
"

注意:如果你的MySQL禁用了LOCAL INFILE,需要先在配置里开启,或者连接时加上--local-infile参数。

为什么终端显示正常?

终端会自动解析原始的换行符、制表符,把它们转换成视觉上的换行和缩进;但MySQL在处理未转义的字符串时,会把这些字符当成SQL语句的空白,直接忽略掉,所以数据库里就变成了一行。

内容的提问来源于stack exchange,提问作者Thomas

火山引擎 最新活动