Mysql 使用现有数据向表中插入数据,然后删除会话期间未触及的数据
我在对一个充满数据的表进行重复键更新时插入了一堆Mysql 使用现有数据向表中插入数据,然后删除会话期间未触及的数据,mysql,sql,database,sql-insert,database-replication,Mysql,Sql,Database,Sql Insert,Database Replication,我在对一个充满数据的表进行重复键更新时插入了一堆 我需要用这些数据填充表,并删除我没有填充的数据(我的意思是删除我的插入中没有提到的行) 我试过的和起作用的: 在表中创建新的时间戳列 在插入过程中,使用当前时间戳插入或更新此列,以便我接触的所有行都有最新的时间戳 运行删除查询,删除早于脚本开始时间的所有行 这个想法非常有效,但有一个问题:我的复制二进制日志在两种模式(行和语句)上都被不必要的数据填充。我根本不需要复制时间戳 我不想在插入之前执行截断表,因为我的应用程序应该能够不间断地访问数据(旧
我需要用这些数据填充表,并删除我没有填充的数据(我的意思是删除我的插入中没有提到的行)
我试过的和起作用的:
在表中创建新的时间戳列
在插入过程中,使用当前时间戳插入或更新此列,以便我接触的所有行都有最新的时间戳
运行删除查询,删除早于脚本开始时间的所有行
这个想法非常有效,但有一个问题:我的复制二进制日志在两种模式(行和语句)上都被不必要的数据填充。我根本不需要复制时间戳
我不想在插入之前执行截断表
,因为我的应用程序应该能够不间断地访问数据(旧的或新的)。如果执行TRUNCATE TABLE
操作,表可能会在一段时间内没有数据
我还可以保存插入脚本内存或临时表中的所有主键值,然后删除不在该表中的行,但我希望有一种更优化、更聪明的方法来做到这一点
你知道我怎样才能达到这个目标吗?这样我就可以更新数据,只删除未触及的行,只复制更改(我想是在行模式下)?我对复制二进制日志不太熟悉,如果不起作用,请提前道歉。我假设可以为表设置不同的日志记录
我会这样做:
- 为具有相同主键列的新数据创建一个表
旧桌子
- 删除旧表中未在新表中找到的所有行
- 根据新表更新旧表中的行
这样就不会有不必要的日志插入。
这假设您在服务器中有所需的空间,但可以工作。编辑您的问题并提供有关用例的更多详细信息。您要替换多少数据?应用程序能否使用更新前后的“部分”数据?有多少列正在被修改?truncate table
方法在大多数情况下似乎都是正确的方法,因此很高兴知道为什么它在您的案例中不起作用。@GordonLinoff我的问题中写到了这个案例:因为我应该不间断地删除对数据的访问,不管它是旧的还是新的,这就是为什么。如果truncate表被复制,那么连接断开从属表将为空。这一点都不好。我不希望桌子在任何时候都是空的。您还需要考虑其他因素(例如复制),这些因素只是间接提及,没有提供任何大小调整。我的最佳猜测是,使用分区的解决方案可能最适合您的问题。在添加和删除分区时,您仍然会遇到一个“小问题”,但这应该是一个小的开销,并且和数据的大小无关。