当前位置: 首页 > 编程日记 > 正文

sqlinesdata教程_如何将Oracle数据导入MySQL

Manager进程:需要源端跟目标端同时运行,主要作用是监控管理其它进程,报告错误,分配及清理数据存储空间,发布阈值报告等

Extract进程:运行在数据库源端,主要用于捕获数据的变化,负责全量、增量数据的抽取

Trails文件:临时存放在磁盘上的数据文件

Data Pump进程:运行在数据库源端,属于Extract进程的一个辅助进程,如果不配置Data Pump,Extract进程会将抽取的数据直接发送到目标端的Trail文件,如果配置了Data Pump,Extract进程会将数据抽取到本地Trail文件,然后通过Data Pump进程发送到目标端,配置Data Pump进程的主要好处是即使源端到目标端发生网络中断,Extract进程依然不会终止

Collector进程:接收源端传输过来的数据变化,并写入本地Trail文件中

Replicat进程:读取Trail文件中记录的数据变化,创建对应的DML语句并在目标端回放

二、迁移方案

(一)环境信息

OGG版本    OGG 12.2.0.2.2 For Oracle    OGG 12.2.0.2.2 For MySQL

数据库版本    Oracle 11.2.0.4    MySQL 5.7.21

OGG_HOME    /home/oracle/ogg    /opt/ogg

(二)表结构迁移

表结构迁移属于难度不高但内容比较繁琐的一步,我们在迁移表结构时使用了一个叫sqlines的开源工具,对于sqlines工具在MySQL端创建失败及不符合预期的表结构再进行特殊处理,以此来提高表结构转换的效率。

注意:OGG在Oracle迁移MySQL的场景下不支持DDL语句同步,因此表结构迁移完成后到数据库切换前尽量不要再修改表结构。

(三)数据迁移

数据同步的操作均采用OGG工具进行,考虑数据全量和增量的衔接,OGG需要先将增量同步的抽取进程启动,抓取数据库的redo log,待全量抽取结束后开启增量数据回放,应用全量和增量这段期间产生的日志数据,OGG可基于参数配置进行重复数据处理,所以使用OGG时优先将增量进行配置并启用。此外,为了避免本章节篇幅过长,OGG参数将不再解释,有需要的朋友可以查看官方提供的Reference文档查询任何你不理解的参数。

1.源端OGG配置

(1)Oracle数据库配置

针对Oracle数据库,OGG需要数据库开启归档模式及增加辅助补充日志、强制记录日志等来保障OGG可抓取到完整的日志信息

查看当前环境是否满足要求,输出结果如下图所示:

(2)Oracle数据库OGG用户创建

OGG需要有一个用户有权限对数据库的相关对象做操作,以下为涉及的权限,该示例将创建一个用户名和密码均为ogg的Oracle数据库用户并授予以下权限

(3)源端OGG 管理进程(MGR)配置

(4)源端OGG 表级补全日志(trandata)配置

表级补全日志需要在最小补全日志打开的情况下才起作用,之前只在数据库级开启了最小补全日志(alter database add supplemental log data;),redolog记录的信息还不够全面,必须再使用add trandata开启表级的补全日志以获得必要的信息。

(5)源端OGG 抽取进程(extract)配置

Extract进程运行在数据库源端,负责从源端数据表或日志中捕获数据。Extract进程利用其内在的checkpoint机制,周期性地检查并记录其读写的位置,通常是写入到本地的trail文件。这种机制是为了保证如果Extract进程终止或者操作系统宕机,我们重启Extract进程后,GoldenGate能够恢复到以前的状态,从上一个断点处继续往下运行,而不会有任何数据损失。

(6)源端OGG 传输进程(pump)配置

pump进程运行在数据库源端,其作用非常简单。如果源端的Extract抽取进程使用了本地trail文件,那么pump进程就会把trail文件以数据块的形式通过TCP/IP协议发送到目标端,Pump进程本质上是Extract进程的一种特殊形式,如果不使用trail文件,那么Extract进程在抽取完数据后,直接投递到目标端。

补充:pump进程启动时需要与目标端的mgr进程进行连接,所以需要优先将目标端的mgr提前配置好,否则会报错连接被拒绝,无法传输抽取的日志文件到目标端对应目录下

(7)源端OGG 异构mapping文件(defgen)生成

该文件记录了源库需要复制的表的表结构定义信息,在源库生成该文件后需要拷贝到目标库的dirdef目录,当目标库的replica进程将传输过来的数据apply到目标库时需要读写该文件,同构的数据库不需要进行该操作。

2.目标端OGG配置

(1)目标端MySQL数据库配置

确认MySQL端表结构已经存在

MySQL数据库OGG用户创建

mysql> create user 'ogg'@'%' identified by 'ogg';

mysql> grant all on *.* to 'ogg'@'%';

#### 提前创建好ogg存放checkpoint表的数据库

mysql> create database ogg;

(2)目标端OGG 管理进程(MGR)配置

目标端的MGR进程和源端配置一样,可直接将源端配置方式在目标端重复执行一次即可,该部分不在赘述

(3)目标端OGG 检查点日志表(checkpoint)配置

checkpoint表用来保障一个事务执行完成后,在MySQL数据库从有一张表记录当前的日志回放点,与MySQL复制记录binlog的GTID或position点类似。

#### 切换至ogg软件目录并执行ggsci进入命令行终端

shell> cd $OGG_HOME

shell> ggsci

ggsci> edit param ./GLOBALS

checkpointtable ogg.ggs_checkpoint

ggsci> dblogin sourcedb ogg@17X.1X.84.121:3306 userid ogg

ggsci> add checkpointtable ogg.ggs_checkpoint

(4)目标端OGG 回放线程(replicat)配置

Replicat进程运行在目标端,是数据投递的最后一站,负责读取目标端Trail文件中的内容,并将解析其解析为DML语句,然后应用到目标数据库中。

#### 切换至ogg软件目录并执行ggsci进入命令行终端

shell> cd $OGG_HOME

shell> ggsci

#### 添加一个回放线程并与源端pump进程传输过来的trail文件关联,并使用checkpoint表确保数据不丢失

ggsci> add replicat r_cms,exttrail /opt/ogg/dirdat/ms,checkpointtable ogg.ggs_checkpoint

#### 增加/编辑回放进程配置文件

ggsci> edit params r_cms

replicat r_cms

targetdb cms@17X.1X.84.121:3306,userid ogg,password ogg

sourcedefs /opt/ogg/dirdef/cms.def

discardfile /opt/ogg/dirrpt/r_cms.dsc,append,megabytes 1024

HANDLECOLLISIONS

MAP cms.*,target cms.*;

注意:replicat进程只需配置完成,无需启动,待全量抽取完成后再启动。

至此源端环境配置完成

待全量数据抽取完毕后启动目标端回放进程即可完成数据准实时同步。

3.全量同步配置

全量数据同步为一次性操作,当OGG软件部署完成及增量抽取进程配置并启动后,可配置1个特殊的extract进程从表中抽取数据,将抽取的数据保存到目标端生成文件,目标端同时启动一个单次运行的replicat回放进程将数据解析并回放至目标数据库中。

(1)源端OGG 全量抽取进程(extract)配置

#### 切换至ogg软件目录并执行ggsci进入命令行终端

shell> cd $OGG_HOME

shell> ggsci

#### 增加/编辑全量抽取进程配置文件

#### 其中RMTFILE指定抽取的数据直接传送到远端对应目录下

#### 注意:RMTFILE参数指定的文件只支持2位字符,如果超过replicat则无法识别

ggsci> edit params ei_cms

SOURCEISTABLE

SETENV (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8")

SETENV (ORACLE_SID=cms)

SETENV (ORACLE_HOME=/data/oracle/11.2/db_1)

USERID ogg@appdb,PASSWORD ogg

RMTHOST 17X.1X.84.121,MGRPORT 7809

RMTFILE /opt/ogg/dirdat/ms,maxfiles 100,megabytes 1024,purge

TABLE cms.*;

#### 启动并查看抽取进程正常

shell> nohup ./extract paramfile ./dirprm/ei_cms.prm reportfile ./dirrpt/ei_cms.rpt &

## 查看日志是否正常进行全量抽取

shell> tail -f ./dirrpt/ei_cms.rpt

(2)目标端OGG 全量回放进程(replicat)配置

#### 切换至ogg软件目录并执行ggsci进入命令行终端

shell> cd $OGG_HOME

shell> ggsci

ggsci> edit params ri_cms

SPECIALRUN

END RUNTIME

TARGETDB cms@17X.1X.84.121:3306,USERID ogg,PASSWORD ogg

EXTFILE /opt/ogg/dirdat/ms

DISCARDFILE ./dirrpt/ri_cms.dsc,purge

MAP cms.*,TARGET cms.*;

#### 启动并查看回放进程正常

shell> nohup ./replicat paramfile ./dirprm/ri_cms.prm reportfile ./dirrpt/ri_cms.rpt &

#### 查看日志是否正常进行全量回放

shell> tail -f ./dirrpt/ri_cms.rpt

三、数据校验

数据校验是数据迁移过程中必不可少的环节,本章节提供给几个数据校验的思路共大家参数,校验方式可以由以下几个角度去实现:

1.通过OGG日志查看全量、增量过程中discards记录是否为0来判断是否丢失数据;

2.通过对源端、目标端的表执行count判断数据量是否一致;

3.编写类似于pt-table-checksum校验原理的程序,实现行级别一致性校验,这种方式优缺点特别明显,优点是能够完全准确对数据内容进行校验,缺点是需要遍历每一行数据,校验成本较高;

4.相对折中的数据校验方式是通过业务角度,提前编写好数十个返回结果较快的SQL,从业务角度抽样校验。

四、迁移问题处理

本章节将讲述迁移过程中碰到的一些问题及相应的解决方式。

(一)MySQL限制

在Oracle到MySQL的表结构迁移过程中主要碰到以下两个限制:

1. Oracle端的表结构因为最初设计不严谨,存在大量的列使用varchar(4000)数据类型,导致迁移到MySQL后超出行限制,表结构无法创建。由于MySQL本身数据结构的限制,一个16K的数据页最少要存储两行数据,因此单行数据不能超过65,535 bytes,因此针对这种情况有两种解决方式:

根据实际存储数据的长度,对超长的varchar列进行收缩;

对于无法收缩的列转换数据类型为text,但这在使用过程中可能导致一些性能问题;

2. 与第一点类似,在Innodb存储引擎中,索引前缀长度限制是767 bytes,若使用DYNAMIC、COMPRESSED行格式且开启innodblargeprefix的场景下,这个限制是3072 bytes,即使用utf8mb4字符集时,最多只能对varchar(768)的列创建索引;

3. 使用ogg全量初始化同步时,若存在外键约束,批量导入时由于各表的插入顺序不唯一,可能子表先插入数据而主表还未插入,导致报错子表依赖的记录不存在,因此建议数据迁移阶段禁用主外键约束,待迁移结束后再打开。

mysql>set global foreign_key_checks=off;

(二)全量与增量衔接

HANDLECOLLISIONS参数是实现OGG全量数据与增量数据衔接的关键,其实现原理是在全量抽取前先开启增量抽取进程,抓去全量应用期间产生的redo log,当全量应用完成后,开启增量回放进程,应用全量期间的增量数据。使用该参数后增量回放DML语句时主要有以下场景及处理逻辑:

目标端不存在delete语句的记录,忽略该问题并不记录到discardfile

目标端丢失update记录

- 更新的是主键值,update转换成insert

- 更新的键值是非主键,忽略该问题并不记录到discardfile

目标端重复insert已存在的主键值,这将被replicat进程转换为UPDATE现有主键值的行

(三)OGG版本选择

在OGG版本选择上我们也根据用户的场景多次更换了OGG版本,最初因为客户的Oracle 数据库版本为11.2.0.4,因此我们在选择OGG版本时优先选择使用了11版本,但是使用过程中发现,每次数据抽取生成的trail文件达到2G左右时,OGG报错连接中断,查看RMTFILE参数详细说明了解到trail文件默认限制为2G,后来我们替换OGG版本为12.3,使用MAXFILES参数控制生成多个指定大小的trail文件,回放时Replicat进程也能自动轮转读取Trail文件,最终解决该问题。但是如果不幸Oracle环境使用了Linux 5版本的系统,那么你的OGG需要再降一个小版本,最高只能使用OGG 12.2。

(四)无主键表处理

在迁移过程中还碰到一个比较难搞的问题就是当前Oracle端存在大量表没有主键。在MySQL中的表没有主键这几乎是不被允许的,因为很容易导致性能问题和主从延迟。同时在OGG迁移过程中表没有主键也会产生一些隐患,比如对于没有主键的表,OGG默认是将这个一行数据中所有的列拼凑起来作为唯一键,但实际还是可能存在重复数据导致数据同步异常,Oracle官方对此也提供了一个解决方案,通过对无主键表添加GUID列来作为行唯一标示,具体操作方式可以搜索MOS文档ID 1271578.1进行查看。

(五)OGG安全规则

报错信息

2019-03-08 06:15:22  ERROR   OGG-01201  Error reported by MGR : Access denied.

错误信息含义源端报错表示为该抽取进程需要和目标端的mgr进程通讯,但是被拒绝,具体操作为:源端的extract进程需要与目标端mgr进行沟通,远程将目标的replicat进行启动,由于安全性现在而被拒绝连接。

报错原因

在Oracle OGG 11版本后,增加了新特性安全性要求,如果需要远程启动目标端的replicat进程,需要在mgr节点增加访问控制参数允许远程调用

解决办法

在源端和目标端的mgr节点上分别增加访问控制规则并重启

## 表示该mgr节点允许(ALLOW)10.186网段(IPADDR)的所有类型程序(PROG *)进行连接访问ACCESSRULE, PROG *, IPADDR 10.186.*.*, ALLOW

(六)数据抽取方式

报错信息

2019-03-15 14:49:04  ERROR   OGG-01192  Trying to use RMTTASK on data types which may be written as LOB chunks (Table: 'UNIONPAYCMS.CMS_OT_CONTENT_RTF').

报错原因

根据官方文档说明,当前直接通过Oracle数据库抽取数据写到MySQL这种initial-load方式,不支持LOBs数据类型,而表 UNIONPAYCMS.CMSOTCONTENT_RTF 则包含了CLOB字段,无法进行传输,并且该方式不支持超过4k的字段数据类型

解决方法

将抽取进程中的RMTTASK改为RMTFILE参数 官方建议将数据先抽取成文件,再基于文件数据解析进行初始化导入

相关文章:

关于PHP.ini文件的设定

php.ini文件中记录了php的配置,因此正确读取此配置文件对于php的部署实施很重要。 windows平台中,有2种常用的方法。 第一种方法:把php.ini复制到c:\windows目录中。 第二种方法:配置apache服务器,在..\Apache Softwar…

PAT (Advanced Level) 1132~1135:1132 模拟 1133模拟(易超时!) 1134图 1135红黑树

1132 Cut Integer(20 分) 题意:将一个含K(K为偶数)个数字的整数Z割分为A和B两部分,若Z能被A*B整除,则输出Yes,否则输出No。 分析:当A*B为0的时候,不能被Z整除…

poj 1523(无向联通图的割点)

结合tarjan算法思想,这题终于写了出来。 同样用dfs将图变成为一颗树,这样可以提供许多有用的性质。 对于一个无向连通图,dfs后的树为只有回边(回边Euv,v是u的祖先)和生成树的边的图。 那么在遍历到一个点u的时候&#…

IPC--信号量

信号量概念理解 信号量本质上 是一个计数器,用来统计临界资源申请资源的个数。其中的二元信号量的 值是0或者是1,即是要么是有,要么是无。信号量本身也是临界资源,所以一定要保证其原子性。信号量的工作原理:两个进程…

7 自动开启网卡_淘汰的旧手机别扔掉,这样设置变身4G上网卡

很多人都用过usb无线上网卡,把手机SIM卡插到上网的卡槽内,然后把usb上网卡插到电脑usb口,电脑安装好驱动程序后,即可畅游网络世界。当初3G上网卡价格不菲,随着更新换代4G快要过去,5G开始试商用,…

Struts2 的stream result用法

2019独角兽企业重金招聘Python工程师标准>>> <action name"download" class"com.unmi.action.DownloadAction"> <result name"success" type"stream"><!--type 为 stream 应用 StreamResult 处理-->…

Largest Rectangle in a Histogram

ps&#xff1a;单调栈&#xff0c;注意红色部分的代码。 int n;stack<P> s;inline void upd(LL &x, LL y) { (x < y) && (x y); }int main() {while(sc(n) ! EOF && n) {while(!s.empty()) s.pop();LL ans 0;Rep(i, 1, n) {int x;sc(x);if (s.e…

IPC--共享内存

有了之前的学习经验&#xff0c;共享内存对我们学习起来相对简单一些了&#xff0c;这里简单说说共享内存的一些&#xff0c;然后对于函数的分析直接在代码里面的注释部分有说明&#xff0c;如果还是不懂&#xff0c;可以先看看前面的关于IPC–信号量还有IPC–消息队列的讲解 …

2020年行政区划代码_2020年柳州市行政区划,了解柳州市有几个区,详细数据

本文通过整理了柳州市行政区划代码数据及柳州市统计用的城乡划分代码&#xff0c;带你了解柳州市有几个区、县及下面的街道和镇划分详细情况。柳州市有几个区、县、县级市&#xff1f;答&#xff1a;柳州市有5个区、5个县(行政区划2020年7月)。分别为&#xff1a;城中区、鱼峰区…

sql2000 转sql2008

1&#xff0c;在sql2008服务器上新建空数据库&#xff0c;与sql2000同名&#xff0c;当然可以不同名。 2&#xff0c;在sql2008服务器上选择数据库&#xff0c;点右键&#xff0c;任务-导入数据。打开导入数据向导。 3&#xff0c;点击下一步&#xff0c;选择数据源。数据源可以…

linux下查看网卡型号

查看网卡型号[rootcentos /]# lspci | grep Ethernet02:01.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 10)我这里型号是79c970,驱动pcnet32.查看驱动信息[rootcentos /]# modinfo pcnet32filename: /lib/modules/2.6.18-194.el5/…

linux_域名映射

vi /etc/hosts在最后加上ip及映射的域名192.168.229.111 node001192.168.229.112 node002192.168.229.113 node003 转载于:https://www.cnblogs.com/lxyuuuuu/p/9578659.html

地址解析协议ARP

设计需求 ARP协议解决的问题就是&#xff1a;在同一个局域网中&#xff0c;解决主机IP地址和硬件地址的映射问题 基本使用原理 当数据在网络中某一条链路传输的时候我们知道目的主机的IP地址&#xff0c;但是不知道硬件地址&#xff0c;ARP协议就是解决这个问题的一个协议&a…

ie8加载js太慢_js ie8 慢

Re请教ap6214f2r版主一些问题引用第2楼ap6214f2r于2012-09-10 14:08发表的 :楼主&#xff0c;关于你说的慢&#xff0c;我去看了下你网站响应速度非常快[attachment26863]这个请求是计算签名&#xff0c;跳转到OSS的。.......老大&#xff0c;我刚才试了一下&#xff0c;不是线…

LINQ : IEnumerableT and IQueryableT区别

本地数据源计算机会自动使用IEnumberable<T>,远程数据源会使用IQueryable<T> 下面这条语句没有使用数据库里的EF数据&#xff0c;显示如下&#xff1a; 下面这条语句使用数据库里的EF数据&#xff0c;显示如下&#xff1a; 针对Linq “LINQ TO to OBJECTS”&#…

九大网络安全失误,需要注意

在我们的职业生涯中大都曾经有过一次这样的经历——我是说你认为足以让你丢掉饭碗的失误。我的第一次重大失误是曾经重启了校园里的所有路由器&#xff0c;不是一个接一个的&#xff0c;而是所有一次完成。我写了一个脚本&#xff0c;为所有的路由器安装一个安全更新&#xff0…

python学习笔记——Thread常用方法

http://blog.sina.com.cn/s/blog_4b5039210100ewie.html Thread对象中的一些方法&#xff1a; 以前说过多线程&#xff0c;用到threading模块中的Thread对象&#xff0c;其中的start和run方法比较熟悉了&#xff0c;start&#xff08;&#xff09;是重载了Thread对象中的run方法…

常见的路由选择算法

一、路由表 所谓路由表&#xff0c;指的是路由器或者其他互联网网络设备上存储的表&#xff0c;该表中存有到达特定网络终端的路径&#xff0c;在某些情况下&#xff0c;还有一些与这些路径相关的度量。 二、常见路由表生成算法 路由算法是提高路由协议功能&#xff0c;尽量…

linux 远程挂载摄像头_基于Linux的嵌入式网络摄像机设计

本嵌入式网络摄像机采用高性能ARM9芯片微处理器&#xff0c;内置嵌入式Web服务器。通过嵌入式多任务操作系统采集摄像机视频数据&#xff1b;采集的视频信号数字化后经MJPEG算法压缩&#xff0c;再通过内部总线送到内置的Web服务器&#xff1b;使用者可以直接用浏览器观看Web服…

2012 ARM嵌入式开发应用研讨会杂谈

记得以前参加的ARM的研讨会&#xff0c;名称是技术研讨会&#xff0c;不知道为什么现在改名为嵌入式开发应用研讨会了。不过今年演讲的重点就是 ARM DS-5开发工具&#xff08;还免费发放了一本《Linux/Android开发利器 ARM DS-5使用指南》书籍&#xff09;&#xff0c;也许这就…

打印不同对象的字节表示 ( 对int*强制转换成unsigned char*的理解 )

此文章参考《深入理解计算机系统》P31。 先看如下代码&#xff1a; 12345的十六进制表示为&#xff1a;0x00003039 1 #include <stdio.h>2 3 int main()4 {5 int a 12345;6 char *q (char *)(&a);7 for(int i 0; i < sizeof(a); i)8 prin…

NAT技术和代理服务器

一、代理服务器 所谓“代理”&#xff0c;就是代而劳之的意思。代理服务器就是代理网络用户去取得网络信息&#xff0c;形象的说&#xff1a;它是网络信息的中转站&#xff0c;使得一个网络终端和另一个网络终端不直接进行相连&#xff0c;代理网络用户去取得信息。主要工作在O…

链接全局变量再说BSS段的清理

废话就不多说了&#xff0c;开始。。。 再说BSS段的清算 以前遇到一个裸机程序不能改变全局变量值的问题&#xff0c;最后模模糊糊处理了&#xff1a;手动添加了一个链接脚本&#xff0c;清算了BSS段。问题得以处理&#xff0c;就认定是BSS段清算的问题&#xff0c;全局变量在B…

ios启动页尺寸_关于移动端App启动页的策划方案

App启动页是指app在启东时需要加载必要的运行环境和配置&#xff0c;在这个过程中提示用户等待的一个过渡页面。在产品经理眼里启动页是app给予用户重要的第一印象&#xff1b;也是App最重要的黄金页面之一&#xff0c;所有用户100%都会看到的页面。启动页适合用来做以下几个事…

事件流--事件冒泡现象及阻止

事件冒泡现象 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>事件冒泡现象</title><style>div{padding: 50px;}#div1{background: red;}#div2{background: blue;}#div3{background: yell…

谁知道静态成员的纠结心境

我们在实际开发的过程中&#xff0c;可能需要某些类的成员变量并不是针对每一个对象的&#xff0c;而是针对每一个类而言的&#xff0c;比如在银行中有一个利率数据&#xff0c;我们希望的是&#xff0c;当一个利率改变的时候&#xff0c;所有的对象都能够看到这个改变的数据&a…

.net ConfigurationSectionDesigner插件使用

最近接触了vs2010的一款插件&#xff1a;ConfigurationSectionDesigner。ConfigurationSectionDesigner是一个图型化设计.net的配置块和自动生成需要代码和schema定义的codeplex上的一个开源项目&#xff0c;现在分享出来&#xff0c;希望对大家有所帮助。 .Net配置体系中可以是…

对应到对象 数据库驼峰_【GI的自主空间数据库】一种竞争力,叫技术引领;一种竞争力,叫时间沉淀...

引子&#xff1a;GI的自主空间数据库及GIS框架来自于求学时MAPGIS的引导&#xff0c;工作时ARCGIS的追随&#xff0c;读博时IBM和Microsoft2篇文献...。即使在大数据技术发展的今天&#xff0c;自主空间数据库存储仍然有其技术优势&#xff0c;近20年的时间沉淀&#xff0c;是G…

TSM备份Windows数据

一、备份数据 1.使用备份勾当客户端&#xff0c;可以在原始文件出现损坏的时候&#xff0c;恢复备份版本。TSM提供备份和恢复文档的类型包括:FAT&#xff0c;NTFS和FAT32.2.合适备份和合适归档文件当备份-归档客户端备份或归档一个文件&#xff0c;他会发送一份文档的副本和它的…

GM Tech 2 works with Hummer Yes or No

This is about GM Tech 2 scan tool for Hummer troubleshooting and programming. Can I have a cheap Tech 2 for Hummer? Yep. Both the original and HQ clone can work for your car. Where can I get a working clone at a good price? https://www.obd2tool.com/goods…