我想在MySQL中运行一个大文件的导入.但是,我不希望它写入二进制日志,因为导入将花费很长时间,并导致奴隶远远落后.事实上,我宁愿在奴隶上单独运行它,因为它在系统上会更容易.有问题的表是一个新表,因此我不必担心它会失去同步,因为主设备和所有从设备最终会有相同的数据,因为它们都将导入相同的文件最终.我也不想更改任何replicate-ignore-*或binlog_ignore-*选项,因为它们需要重新启动有问题的服务器.有没有办法运行单个查询而不将其写入二进制日志?
我已经知道了答案,但我在网上找不到它,所以我让某人发布答案以获得一些代表点.如果没有一点白色的答案,我会发布我找到的答案.
我有一个二进制日志激活的MySQL服务器.一天日志文件被"旋转",即MySQL似乎停止写入它并创建新的日志文件.例如,我目前在/ var/lib/mysql中有这些文件
-rw-rw---- 1 mysql mysql 10485760 Jun 7 09:26 ibdata1
-rw-rw---- 1 mysql mysql 5242880 Jun 7 09:26 ib_logfile0
-rw-rw---- 1 mysql mysql 5242880 Jun 2 15:20 ib_logfile1
-rw-rw---- 1 mysql mysql 1916844 Jun 6 09:20 mybinlog.000004
-rw-rw---- 1 mysql mysql 61112500 Jun 7 09:26 mybinlog.000005
-rw-rw---- 1 mysql mysql 15609789 Jun 7 13:57 mybinlog.000006
-rw-rw---- 1 mysql mysql 54 Jun 7 09:26 mybinlog.index
Run Code Online (Sandbox Code Playgroud)
而mybinlog.000006正在增长.
我可以简单地使用mybinlog.000004和mybinlog.000005,将它们压缩并转移到另一台服务器,或者我之前需要做些什么吗?
mybinlog.index中存储了哪些信息?只有关于最新二进制日志的信息?
更新:我知道我可以使用更新mybinlog.index文件的PURGE BINARY LOGS删除日志.但是,我需要在删除之前将日志传输到另一台计算机(我测试备份是否在另一台计算机上有效).为了减少传输大小,我希望bzip2文件.如果日志文件不再"存在",PURGE BINARY LOGS会做什么?
当我有两个mysql服务器有不同的工作(持有不同的数据库),但希望能够使用其中一个在另一个失败时插入,你会建议我如何保持它们两者的数据相等"关闭实时"?
显然,不可能每x分钟进行一次完整的数据库转储.
我读过有关二进制日志的信息,这是我需要的方式吗?请问这不会减慢后备服务器的速度吗?有没有办法在二进制日志中不包含一些表 - 数据发生了变化并不重要?
表1:包括厨房水槽在内的一切.日期格式错误(年末,因此您无法对该列进行排序),存储为VARCHAR的数字,"street"列中的完整地址,firstname列中的firstname和lastname,lastname列中的city,不完整的地址,行数根据多年来发生变化的一些规则,重复记录,不完整记录,垃圾记录......将数据从一个字段移动到另一个字段,从而更新前一行...您可以将其命名为...哦,当然不是TIMESTAMP或PRIMARY KEY栏目即将来临.
表2:打开这个婴儿后,任何正常化的希望都消失了.对于表1中的每个条目和行更新,我们都有一行.所以复制品就像没有明天(800MB价值)和像Phone1 Phone2 Phone3 Phone4 ... Phone15这样的列(它们不叫电话.我用它来说明)foriegn键是......好好猜测.根据表1中行的数据类型,有三个候选项
表3:它会变得更糟吗?哦,是的."外键是短划线,点,数字和字母的VARCHAR列组合!如果不提供匹配(通常不提供),那么类似产品代码的第二列应该.具有名称的列与它们内部的数据没有关联,并且必须与Phone1进行电话交换... Phone15.从Table1复制列,而不是TIMESTAMP或PRIMARY KEY列.
表4:被描述为一项工作,并且随时可能发生变化.它与其他人相似.
在接近1米的行中,这是一个很大的混乱.幸运的是,这不是我的大混乱.不幸的是,我必须为每个"客户"提供一份复合记录.
最初,我设计了Table1的四步翻译,添加了一个PRIMARY KEY并将所有日期转换为可排序的格式.然后是几个返回过滤数据的查询步骤,直到我将Table1用于从其他表中拉出以形成合成.经过数周的工作,我使用一些技巧将其降低到一步.所以现在我可以将我的应用程序指向混乱并提取一个很好的合成数据表.幸运的是,我只需要一个电话号码,因此我的桌子正常化不是问题.
然而,这是真正的任务开始的地方,因为每天都有数百名员工以您不想要的方式添加/更新/删除此数据库,每天晚上我必须检索新行.
由于任何表中的现有行都可以更改,并且由于没有TIMESTAMP ON UPDATE列,因此我将不得不求助于日志以了解发生了什么.当然这假设有一个二进制日志,但没有!
介绍这个概念就像铅气球一样.我不妨告诉他们,他们的孩子将不得不接受实验性手术.他们并不完全是高科技...如果你没有聚集......
这种情况有点微妙,因为它们有一些我公司非常想要的有价值的信息.我被一家大公司的高级管理人员(你知道他们是怎么做的)发送给"实现它".
我想不出处理夜间更新的任何其他方法,比用另一个应用程序解析bin日志文件,弄清楚他们在白天对该数据库做了什么,然后相应地合成我的表.我真的只需要看看他们的table1来弄清楚该怎么做我的桌子.其他表只提供清除记录的字段.(使用MASTER SLAVE无济于事,因为我会有一塌糊涂.)
另一种方法是为table1的每一行创建一个唯一的哈希,并构建一个哈希表.然后我会每晚检查整个ENTIRE数据库,看看哈希值是否匹配.如果他们没有那么我会读取该记录并检查它是否存在于我的数据库中,如果确实存在,那么我会在我的数据库中更新它,如果它没有那么它是一个新的记录,我会插入它.这很难看并且不快,但解析二进制日志文件也不是很好.
我写这篇文章是为了帮助弄清楚这个问题.经常告诉别人有助于澄清问题,使解决方案更加明显.在这种情况下,我只是有一个更大的头痛!
非常感谢您的想法.
我已经使用MAMP安装了几个星期了,当我今天启动它时它就无法启动.没有运行mysql进程所以我检查了错误日志,当我启动服务器时显示以下内容:
130826 14:19:55 mysqld_safe Starting mysqld daemon with databases from /Applications/MAMP/db/mysql
130826 14:19:55 [Warning] You have forced lower_case_table_names to 0 through a command-line option, even though your file system '/Applications/MAMP/db/mysql/' is case insensitive. This means that you can corrupt a MyISAM table by accessing it with different cases. You should consider changing lower_case_table_names to 1 or 2
130826 14:19:55 [Warning] One can only use the --user switch if running as root
130826 14:19:55 [Note] Plugin 'FEDERATED' is disabled.
130826 14:19:55 …
Run Code Online (Sandbox Code Playgroud) 在不讨论主/从复制的情况下,我只想自定义在使用SHOW BINLOG EVENTS
. information_schema
已经尝试在和中找到相同的信息,performance_schema
以便我可以SELECT
在正确的桌子上,但我无法找到它。
文档中的可用过滤器似乎不允许直接这样做。
我想要的是这样的:
-- /!\ invalid syntax /!\ --
SHOW BINLOG EVENTS WHERE Event_type = 'Query' AND Info LIKE 'UPDATE%'
Run Code Online (Sandbox Code Playgroud)
-- /!\ invalid syntax /!\ --
SHOW BINLOG EVENTS IN (SELECT Log_name FROM (SHOW BINARY LOGS))
Run Code Online (Sandbox Code Playgroud)
有办法实现这一点吗?
我当前使用该实用程序的解决方法(在MySQL Containermysqlbinlog
中运行):
cd /var/lib/mysql && while read p; do mysqlbinlog -d example_db -s /var/lib/mysql/$p | grep UPDATE; done <./mysql-bin.index; cd - > /dev/null
Run Code Online (Sandbox Code Playgroud) 我试图手动解码mysql二进制日志ROW格式.每个更新/插入/删除事件都以TABLE_MAP_EVENT开头.
此活动包含一个table_id
.我正在使用此id为此表的列定义构建缓存.
我不时会在所述缓存中出错,因为列信息不匹配.我目前无法在短生命连接中重现这些问题,仅在发生二进制日志文件轮换的日志连接中.
我怀疑table_id
它只对一个二进制日志文件是唯一的.有谁知道这个假设是否成立?有谁知道在哪里可以找到声明我可以期待的文件table_id
?
在此先感谢Björn
我已使用SET GLOBAL binlog_expire_logs_seconds = 259200;
查询配置数据库以清除 3 天之前的二进制日志。使用 MySQL 8.0.22。这似乎没有任何影响。bin 日志在 /var/lib/mysq/dbname-bin.000xx 文件下累积。执行
PURGE BINARY LOGS BEFORE '2020-.......'
Run Code Online (Sandbox Code Playgroud)
有效,但我希望数据库引擎自行清除这些日志,而无需自己调用它。否则二进制日志会占用大部分磁盘空间。请建议。
binary-log ×8
mysql ×8
replication ×2
database ×1
error-log ×1
fallback ×1
import ×1
mamp ×1
mysqlbinlog ×1
refactoring ×1