在mysql上,我有两个数据库"parque_test“和"tabelas_temporais",二进制日志被激活。
修改属于“InnoDB”的parque_test表的每个操作都记录在二进制日志上。但是,"parque_test“有使用临时表检索结果的存储过程(它们不用于执行更新、删除或插入)。
为了避免在bin日志上记录临时表的活动,我设置了"/etc/ mysql /my.cnf“文件,以便mysql在"parque_test”上注册除"tabelas_temporais“之外的所有活动。
cat /etc/mysql/my.cnf"
...
#log_bin = /var/log/mysql/mysql-bin.log
log_bin=/mysql-log/bin-log
binlog_do_db=parque_test
binlog_do_db=parque_prod
expire_logs_days = 10
max_binlog_size = 100M
#binlog_do_db = include_database_name
#binlog_ignore_db = include_database_name
binlog_ignore_db=tabelas_temporais
...
所有临时表都是在"tabelas_temporais“模式上创建的;但是,当执行"parque_test”中的存储过程时,二进制日志仍然记录“parque_test”上的活动,其中包含一个命令,如
DROP TEMPORARY TABLE IF EXISTS tabelas_temporais.temp_mod_user;
任何帮助都将不胜感激!
mysql 14.14远端5.5.40,debian gnu (x86_64)使用readline 6.2
发布于 2014-12-10 13:25:00
如果您不知道MySQL二进制日志中的数据库筛选是如何工作的,则可能会有些意外。从手册上
当使用基于语句的日志记录时,下面的示例不像您所期望的那样工作。假设服务器是用
--binlog-ignore-db=sales启动的,然后发出以下语句:USE prices;UPDATE sales.january SET amount=amount+1000;在这种情况下会记录UPDATE语句,因为--binlog-ignore-db只应用于默认数据库(由USE语句确定)。因为sales数据库是在语句中显式指定的,所以没有对语句进行筛选。但是,在使用基于行的日志记录时,UPDATE语句的效果不会写入二进制日志,这意味着不会记录对sales.january表的更改;在这种情况下,--binlog-ignore-db=sales会导致对销售数据库主副本中的表所做的所有更改都被忽略,以便进行二进制日志记录。
简而言之:您可能希望查看基于ROW的日志记录,而不是STATEMENT或MIXED。然而:
您应该记住,用于记录给定语句的格式不一定与binlog_format值所指示的格式相同。例如,像CREATE和ALTER这样的DDL语句总是记录为语句,而不考虑实际的日志记录格式,因此以下基于语句的--binlog-忽略-db规则总是适用于确定语句是否被记录。
DROP也是一个被记录的DDL。所以,这是不是意味着不可能?相反地
……临时表仅在使用基于语句的复制时记录,而对于基于行的复制则不记录。对于混合复制,临时表通常会被记录;用户定义函数(UDF)和UUID()函数都会出现异常.
因此,简而言之,对于“正常”表,如果在记录的模式中工作,这几乎是不可能的,但是,默认情况下,TEMPORARY表在基于ROW的复制中被丢弃。这意味着:切换到基于ROW的复制,您不需要对真正的临时表使用不同的模式。
但是,如果您需要从STATEMENT / MIXED切换到基于ROW的复制,请检查此复制的性能,如果您经常执行大容量更新(许多行受影响),则您的绑定日志将更大一些,因为它将记录每一行更改的情况,而不是导致其发生变化的单一“简单”UPDATE语句。
https://stackoverflow.com/questions/27401551
复制相似问题