首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何才能清除到完成的从二进制日志,负50?

我如何才能清除到完成的从二进制日志,负50?
EN

Stack Overflow用户
提问于 2016-08-29 14:35:23
回答 2查看 204关注 0票数 2

我使用bash清除母版上的二进制日志,前提是奴隶已经完成了这些日志。相反,我想在服务器上留下更多的日志。你能帮我把mysql-bin.000345变成mysql-bin.000295 (从345减去50 )吗?

这是我的剧本:

代码语言:javascript
复制
# Fetch the current `Relay_Master_Log_File` from Slave
relay_master_log_file=$(ssh user@slave "mysql -hlocalhost -uroot -e 'SHOW SLAVE STATUS\G' | grep Relay_Master_Log_File | cut -f2- -d':' | sed -e 's/^[ \t]*//'")

# Purge binary logs on Master up to the current `Relay_Master_Log_File`
purge_cmd="PURGE BINARY LOGS TO '$relay_master_log_file';"
ssh user@master <<EOF
mysql -e "$purge_cmd"
EOF

但是我想将50个(或n)二进制日志保存在Master上。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-29 14:52:09

假设变量中有mysql-bin.000345,则可以执行以下步骤:

  1. 用尾随零去掉开头部分,只留下345。
  2. 使用Bash算法$((...))从345中减去n
  3. 使用printf格式化用零填充的结果

例如:

代码语言:javascript
复制
oldname=mysql-bin.000345
num=$(shopt -s extglob; echo ${filename##mysql-bin.+(0)})
newname=mysql-bin.$(printf '%06d' $((num - n)))
票数 1
EN

Stack Overflow用户

发布于 2016-08-29 14:55:09

您可以在第一个命令本身中使用awk作为奖励,跳过使用grepcutsed

代码语言:javascript
复制
# Fetch the current `Relay_Master_Log_File` from Slave
relay_master_log_file=$(ssh user@slave "mysql -hlocalhost -uroot -e 'SHOW SLAVE STATUS\G' |
awk -F':[[:blank:]]*' '$1~/Relay_Master_Log_File/{split($2, a, /\./); printf "%s.%06d", a[1], a[2]-50}'
)

根据以下评论使用:

代码语言:javascript
复制
ssh user@slave <<-'EOF'
mysql -hlocalhost -uroot -e 'SHOW SLAVE STATUS\G' |
awk -F':[[:blank:]]*' '$1~/Relay_Master_Log_File/{split($2, a, /\./);
     printf "%s.%06d\n", a[1], a[2]-50}'
EOF
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39208833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档