我正在使用bash清除Master上的二进制日志,只有Slave完成了它们。相反,我想在服务器上留下更多的日志。你能帮助我将mysql-bin.000345
变成mysql-bin.000295
(从345
减去50)吗?
这是我的剧本:
# 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
但我想在Master上保留50(或n
)个二进制日志。
答案 0 :(得分:1)
假设变量中有mysql-bin.000345
,您可以执行以下步骤:
$((...))
从345 n
printf
格式化用零填充的结果例如:
oldname=mysql-bin.000345
num=$(shopt -s extglob; echo ${filename##mysql-bin.+(0)})
newname=mysql-bin.$(printf '%06d' $((num - n)))
答案 1 :(得分:1)
您可以使用awk
和作为奖励跳过使用grep
,cut
和sed
的第一个命令。
# 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}'
)
根据以下评论使用:
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