mysql异地备份数据库
前一篇文章《windows服务器应用系统自动备份策略》讲到了mysql数据库本地备份策略,如果觉得备份到服务器上不够安全,防止服务器意外硬件损坏致使备份也丢失。那么可以采取异地备份,网上很多windo...
2024.11.19众所周知,数据库中insert INTO语法是append方式的插入,而最近在处理一些客户数据导入场景时,经常遇到需要覆盖式导入的情况,常见的覆盖式导入主要有下面两种:
1、部分覆盖:新老数据根据关键列值匹配,能匹配上则使用新数据覆盖,匹配不上则直接插入。
2、完全覆盖:直接删除所有老数据,插入新数据。
本文主要介绍如何在数据库中完成覆盖式数据导入的方法。
部分覆盖业务场景某业务每天给业务表中导入大数据进行分析,业务表中某列存在主键,当插入数据和已有数据存在主键冲突时,希望能够对该行数据使用新数据覆盖或者说更新,而当新老数据userid不冲突的情况下,直接将新数据插入到数据库中。以将表src中的数据覆盖式导入业务表des中为例:
应用方案方案一:使用delete+insert组合实现(update也可以,请读者思考)--开启事务START TRANSACTION;--去除主键冲突数据delete FROM desUSING srcWHERE EXISTS (select 1 FROM des WHERE des.userid = src.userid);--导入新数据insert INTO desSELECT *FROM srcWHERE NOT EXISTS (select 1 FROM des WHERE des.userid = src.userid);--事务提交COMMIT;复制方案优点:使用最常见的使用delete和insert即可实现。
方案缺点:1、分了delete和insert两个步骤,易用性欠缺;2、借助子查询识重,delete/insert性能受查询性能制约。
方案二:使用MERGE INTO功能实现MERGE INTO des USING src ON (des.userid = src.userid)WHEN MATCHED THEN update SET des.b = src.bWHEN NOT MATCHED THEN insert VALUES (src.userid,src.b);复制方案优点:MERGE INTO单SQL搞定,使用便捷,内部去重效率高。
方案缺点:需要数据库产品支持MERGE INTO功能,当前Oracle、GaussDB(DWS)等数据库已支持此功能,mysql的insert into on duplicate key也类似此功能。
完全覆盖业务场景某业务每天给业务表中导入一定时间区间的数据进行分析,分析只需要导入时间区间的去除,不需要以往历史数据,这种情况就需要使用到覆盖式导入。
应用方案方案一:使用监听+insert组合实现--开启事务START TRANSACTION;--清除业务表数据truncate des;--插入1月份数据insert INTO des select * FROM src WHERE time > ‘2020-01-01 00:00:00‘ AND time < ‘2020-02-01 00:00:00‘;--提交事务COMMIT;复制方案优点:简单暴力,先清理在插入直接实现类似覆盖写功能。
方案缺点:truncate清理业务表des数据时对表加8级锁直到事务结束,在因数据量巨大而insert时间很长的情况下,des表在很长时间内是不可访问的状态,业务表des相关的业务处于中断状态。
方案二:使用创建临时表过渡的方式实现--开启事务START TRANSACTION;--创建临时表CREATE TABLE temp(LIKE desc INCLUDING ALL);--数据先导入到临时表中insert INTO temp select * FROM src WHERE TIME > ‘2020-01-01 00:00:00‘ AND TIME < ‘2020-02-01 00:00:00‘;--导入完成后删除业务表desDROP TABLE des;--修改临时表名temp->desALTER TABLE temp rename TO des;--提交事务COMMIT;复制方案优点:相比方案一,在insert期间,业务表des可以继续被访问(老数据),即事务提交前分析业务可继续访问老数据,事务提交后分析业务可以访问新导入的数据。
方案缺点:1、组合步骤较多,不易用;2、drop TABLE操作会删除表的依赖对象,例如视图等,后面依赖对象的还原可能会比较复杂。
方案三:使用insert OVERWRITE 功能insert OVERWRITE INTO des select * FROM src WHERE time > ‘2020-01-01 00:00:00‘ AND time < ‘2020-02-01 00:00:00‘;复制方案优点:单条SQL搞定,执行便捷,能够支持一键式切换业务查询的新老数据,业务不中断。
方案缺点:需要产品支持insert OVERWRITE 功能,当前impala、GaussDB(DWS)等数据库均已支持此功能。
总结随着大数据的场景越来越多,数据导入的场景也越来越丰富,除了本文介绍的覆盖式数据导入,还有其他诸如忽略冲突的insert IGNORE 导入等等其他的导入方式,这些导入场景可以以使用基础的insert、update、delete、truncate来组合实现,但是也同样会对高级的一键SQL功能有直接诉求,后面有机会再继续介绍。
点击下方,第一时间了解华为云新鲜技术~
前一篇文章《windows服务器应用系统自动备份策略》讲到了mysql数据库本地备份策略,如果觉得备份到服务器上不够安全,防止服务器意外硬件损坏致使备份也丢失。那么可以采取异地备份,网上很多windo...
2024.11.19背景苏宁易购某原子服务系统,因历史原因,使用的是 DB2 数据库。当时的设计:业务表分 2 个库、100 分表模式。如图:数据库示意图随着业务的发展,该系统数据量由百万级到千万级,再到亿级别,单个分表...
2024.11.20mysql导入excel数据的步骤:1、第一步我们得到了一个excel表,里面有很多需要我们导入的数据。2、删除第1行"准考证号""XXX"....只保留我们需要的数据部分。3、单击"文件"--"另存...
2024.11.21导出表结构mysqldump -uusername -ppasswd -hIP --single-transaction dbname table > /path/file.sql导出数据根据ID导出...
2024.11.20目录:通过命令导出、导入mysql数据库通过管理软件navicat通过phpmyadmin(一)通过命令导出、导入mysql数据库1导出命令 (1)导出数据库 mysqldump -uroot -p ...
2024.11.20