进程之间通讯的几种方法,复制进程)

作者: 编程  发布:2019-11-21

使用SendMessage向另一进程发送WM_COPYDATA消息

1.首先看看什么是OGG,以及OGG的用途

一.Goldengate 产品家庭

  •  Goldengate:核心产品 
  •  Goldengate Director :现已更名为Goldengate Management Pack,为Goldengate提供友好的GUI配置管理界面。 
  •  Goldengate Veridata :为Goldengate源端和目标端提供数据比对和校验的功能

  注意:这三个产品并不是一个打包的产品,需分开单独购买

2014-03-04 Created By BaoXinjian

Send端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Runtime.InteropServices;

namespace SentTest
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.Title = "发送窗口";
        }

        const int WM_COPYDATA = 0x004A;

        public struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int cData;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }

        [DllImport("User32.dll")]
        public static extern int SendMessage(int hwnd, int msg, int wParam, ref COPYDATASTRUCT IParam);
        [DllImport("User32.dll")]
        public static extern int FindWindow(string lpClassName, string lpWindowName);

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            String strSent = "需要发送的信息";

            int WINDOW_HANDLE = FindWindow(null, "接收窗口");
            if (WINDOW_HANDLE != 0)
            {
                byte[] arr = System.Text.Encoding.Default.GetBytes(strSent);
                int len = arr.Length;
                COPYDATASTRUCT cdata;
                cdata.dwData = (IntPtr)100;
                cdata.lpData = strSent;
                cdata.cData = len + 1;
                SendMessage(WINDOW_HANDLE, WM_COPYDATA, 0, ref cdata);
            }
        }
    }
}

      简单的来讲 Oracle Golden Gate (简称OGG)是一种基于日志的结构化数据复制备份软件,它通过解析源数据库在线日志或归档日志获得数据的增量变化,再将这些变化应用到目标数据库,从而实现源数据库与目标数据库同步。OGG可以跨越不通平台(包括不通操作系统,数据库)实现大量数据亚秒一级的实时复制,从而在可以在应急系统、在线报表、实时数据仓库供应、交易跟踪、数据同步、集中/分发、容灾、数据库升级和移植、双业务中心等多个场景下应用。同时,OGG可以实现一对一、广播(一对多)、聚合(多对一)、双向、点对点、级联等多种灵活的拓扑结构

二.GoldenGate的技术架构

  和传统的逻辑复制一样,Oracle GoldenGate实现原理是通过抽取源端的redo log或者archive log,然后通过TCP/IP投递到目标端,最后解析还原应用到目标端,使目标端实现同源端数据同步。下图展示了Oracle GoldenGate的技术架构。

9159.com 1

9159.com 2一、摘要

Get端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Runtime.InteropServices;
using System.Windows.Interop;

namespace GetTest
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        IntPtr hwnd;
        public MainWindow()
        {
            InitializeComponent();
            this.Title = "接受窗口";

            this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
            this.Closed += new EventHandler(MainWindow_Closed);
        }

        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            //窗口加载完毕才可用,否则会报错。
            hwnd = new WindowInteropHelper(this).Handle;
            HwndSource source = HwndSource.FromHwnd(hwnd);
            if (source != null) source.AddHook(WndProc);
        }

        void MainWindow_Closed(object sender, EventArgs e)
        {
            try
            {
                HwndSource.FromHwnd(hwnd).RemoveHook(WndProc);
            }
            catch (Exception)
            {

                throw;
            }

        }

        const int WM_COPYDATA = 0x004A;//WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。
        //Windows在通过WM_COPYDATA消息传递期间,不提供继承同步方式。
        //其中,WM_COPYDATA对应的十六进制数为0x004A
        public struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int cData;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }

        //wpf用此方法
        private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            if (msg == WM_COPYDATA)
            {
                COPYDATASTRUCT cdata = new COPYDATASTRUCT();
                Type mytype = cdata.GetType();
                cdata = (COPYDATASTRUCT)Marshal.PtrToStructure(lParam, mytype);
                this.textBox1.Text = cdata.lpData;
            }
            return IntPtr.Zero;
        }

        //WinFrom用此方法
        /* protected override void DefWndProc(ref Message m)
        {
            switch (m.Msg)
            {
            case WM_COPYDATA:
                COPYDATASTRUCT cdata = new COPYDATASTRUCT();
                Type mytype = cdata.GetType();
                cdata = (COPYDATASTRUCT)m.GetLParam(mytype);
                this.textBox1.Text = cdata.lpData;
                break;
            default:
                base.DefWndProc(ref m);
                break;
            }
        } */
    }
}

 

2.1 Manager进程   

  Manager进程是GoldenGate的控制进程。Manager进程运行在源端和目标端上,它主要有以下几个方面的作用:启动、 监控、重启GoldenGate的其他进程,报告错误及事件,分配数据存储空间,发布阈值报告等。 每个源端或者目标端有且 只能存在一个Manager进程。其运行状态有两种即RUNNING(正在运行)和STOPPED(已经停止)。


参考文档:

c# 进程间同步实现 进程之间通讯的几种方法

2.OGG的逻辑结构图

2.2 Extract进程  

  Extract进程运行在数据库源端,负责从源端数据表或者日志中捕获数据。 在早期的GoldenGate版本中,它通常被称为 Collect进程。按照其所属的阶段不同,Extract的作用可以按照时间来划分:

  •  在初始数据装载阶段,Extract进程直接从源端的数据表中抽取所有数据。
  •  初始数据同步完成以后,Extract进程负责捕获源端数据的变化(DML和DDL)。

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

  其运行状态包括STOPPED(正常停止)、STARTING(正在启动)、RUNNING(正在运行)、ABENDED(Abnomal End的缩写,表示异常结束)。

1.OGG是数据同步软件,或者说是逻辑复制软件,其竞争对手有IBM CDC,DELL shareplex,DSG,DDS等等。

9159.com 3

2.3 Pump进程  

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

  与Pump进程相对应的叫做Server Collector进程,这个进程不需要关注,因为在实际的操作中无需任何配置,所以它是透明的。它运行在目标端,其任务就是把Extract/Pump投递过来的数据块重新组装成trail文件,人们称之为远程trail文件。

2.OGG软件是需要安装在操作系统上的,Oracle DB软件没有自带OGG软件(至少目前是这样的)

如上图所示,OGG包含三大关键进程 Exract,Manager,Replicat等进程:

2.4 Trail文件

  为了更有效的、更安全的把数据库事务信息从源端投递到目标端,GoldenGate引进trail文件的概念。前面提到的Extract抽取完数据之后,GoldenGate会将抽取的事务信息转化成的一种GoldenGate专有格式的文件,源、目标两端都会存在这种文件,源端存放的trail文件叫本地trail文件,目标端存放的trail文件叫远程trail文件。 

  trail文件存在的目的旨在防止单点故障,将事务信息持久化,并且使用checkpoint机制来记录其读写位置。如果故障发生,则数据可以根据checkpoint记录的位置来重传。 
 Trail文件并不总是必须的。人们可以在配置Extract进程的时候通过TCP/IP协议直接把日志的信息投递到目标端。但是并不推荐这么做,因为一旦发生系统宕机或者网络故障,则有可能造成数据的丢失。

3.OGG软件有三大进程(说四大进程也行):

 

2.5 Replicat进程

  Replicat进程,通常把它叫做应用进程。运行在目标端,是数据传递的最后一站,负责读取目标端trail文件中的内容,并将其解析为DML或DDL语句,然后应用到目标数据库中。  和Extract进程一样,Replicat也有其内部的checkpoint机制,保证进程重新启动后可以从上次记录的位置开始恢复,而无数据损失的风险。  它的运行状态和Extract进程一致,包括STOPPED、STARTING、RUNNING、ABENDED。

三大进程:源头抽取进程、源头传输进程、目的端应用进程(即:复制进程)

1.manager进程 (MGR)

三.GoldenGate的目录

 ----整理自网络

四大进程:源头抽取进程、源头传输进程、目的端server进程(负责在目的端写入trail文件)、目的端应用进程(即:复制进程)

   Manager进程是GoldenGate的控制进程,运行在源端和目标端上,在目标端和源端有且只有一个manager进程.

4.OGG软件有两种trail file

   它主要作用有以下几个方面:

源头的trail file:由源头抽取进程写入。

      启动、监控、重启Goldengate的其他进程,报告错误及事件,分配数据存储空间,发布阀值报告等.

目的端的trail file: 源头传输进程传输到目的端,由目的端的server 进程写入目的端操作系统的指定路径下。

 

5.OGG软件中三大进程都有自己的checkpoint(即:检查点,用来记录每种进程读取到什么位置了,写入到什么位置了)

9159.com ,2.extract进程(EXT)

源头抽取进程Extract:有读取检查点 和写入检查点

   Extract运行在数据库源端,负责从源端数据表或者日志中捕获数据。

源头传输进程Dump:有读取检查点 和写入检查点

   Extract的作用可以按照表来时间来划分:

目的端应用进程Replicat:有读取检查点

   1.初始时间装载阶段:在初始数据装载阶段,Extract进程直接从源端的数据表中抽取数据.

6.OGG软件三大进程处理trail file的过程:

   2.同步变化捕获阶段:初始数据同步完成以后,Extract进程负责捕获源端数据的变化(DML和DDL)

源头抽取进程Extract:读取oracle redo log(假设源头数据库是oracle),结合抽取进程的参数文件,将redo log中的内容变为OGG自有格式的文件(即trail file),并写入到源头操作系统的指定路径下

 

源头传输进程Dump:读取“源头抽取进程写入的trail file”,结合传输进程的参数文件,发送需要同步的数据到目的端,在目的端是由server 进程负责写入。

但是OGG并不是对所有的数据库都支持ddl操作

目的端应用进程Replicat:读取目的端操作系统的指定路径下的trail file,结合应用进程的参数文件,形成sql语句,在目的端db上执行这些sql语句。

   Extract进程会捕获所有已配置的需要同步的对象变化,但只会将已提交的事务发送到远程的trail文件用于同步。当事务提交时,所有和该事务相关的日志记录被以事务为单元顺序的记录到trail文件中。Extract进程利用其内在的checkpoint机制,周期性的记录其读写的位置,实现断点同步。通过上面的两个机制,就可以保证数据完整性.

 

   多个Extract 进程可以同时对不同对象进行同步操作。例如,可以在一个extract进程抽取并向目标端发生事务数据的同时,利用另一个extract进程抽取的数据做报表。或者,两个extract进程可以利用两个trail文件,同时抽取并并行传输给两个replicat进程以提高同步性能.

9159.com 4二、Extract Process

   Extract进程的状态:Stopped(正常停止),Starting(正在启动),Running(正在运行),Abended(Abnomal End缩写,标示异常结束)


 

创建Extract Process

3.Pump进程

Step1. 添加extract程序

   pump进程运行在数据库源端,其作用是将源端产生的本地trail文件,把trail以数据块的形式通过TCP/IP 协议发送到目标端,这通常也是推荐的方式。pump进程本质是extract进程的一种特殊形式,如果不使用trail文件,那么extract进程在抽取完数据以后,直接投递到目标端,生成远程trail文件.

GGSCI (gavinprod.com) 51> add extract ext2, tranlog, begin now
EXTRACT added.

   与Pump进程对于的叫Server Collector进程,这个进程不需要引起我们的关注,因为在实际操作过程中,无需我们对其进行任何配置,所以对我们来说它是透明的。它运行在目标端,其任务就是把Extract/Pump投递过来的数据重新组装成远程trail文件.

Step2. 定义extract目录

   pump进程可以在线或者批量配置,他可以进行数据过滤,映射和转换,同时他还可以配置为“直通模式”,这样数据被传输到目标端时就可以直接生成所需的格式,无需另外操作. 直通模式提高了data pump的效率,因为生成后的对象 不需要继续进行检索.

GGSCI (gavinprod.com) 52> add exttrail /opt/oracle/ggate/dirdat/ld, extract ext2
EXTTRAIL added.

 

Step3. 定义extract参数

在大多数情况下,oracle都建议采用data pump,原因如下:

edit params ext1

   1.为目标端或网络问题提供保障:如果只在目标端配置trail文件,由于源端会将extract进程抽取的内容不断的保存在内存中,并及时的发送到目标端。当网络或者目标端出现故障时, 由于extract进程无法及时的将数据发送到目标, extract进程 将耗尽内存然后异常终止。 如果在源端配置了data pump进程,捕获的数据会被转移到硬盘上,预防了异常终止的情况。当故障修复,源端和目标端 恢复连通性时,data pump进程发送源端的trail文件到目标端。

GGSCI (gavinprod.com) 19> edit params EXT2
extract ext2
userid ggate@gavinprod, password oracle
exttrail /opt/oracle/ggate/dirdat/ld
ddl include mapped objname source_prod.*;
table source_prod.*;

   2.可以支持复杂的数据过滤或者转换 :当使用数据过滤或者转换时,可以先配置一个data pump进程在目标端或者源端进行第一步的转换,利用另一个data pump进程或者 Replicat组进行第二部的转换。

 

   3.有效的规划存储资源 :当从多个数据源同步到一个数据中心时,采用data pump的方式,可以在源端保存抽取的数据,目标端保存trail文件,从而节约存储空间。

9159.com 5三、Dump Process

   4.解决单数据源向多个目标端传输数据的单点故障 :当从一个数据源发送数据到多个目标端时,可以为每个目标端分别配置不同的data pump进程。这样如果某个目标端失效或者网络故障时,其他的目标端不会受到影响可以继续同步数据。


 

创建Dump Process

4.Replicat进程

Step1. 添加dump程序

   Replicat进程,称之为复制应用进程。运行在目标端,是数据传递的最后一站,负责读取目标端trail文件中的内容,并将其解析为DML或 DDL语句,然后应用到目标数据库中.和Extract进程一样,Replicat也有其内部的checkpoint机制,保证重启后可以从上次记录的位置开始恢复而无数据损失的风险.

GGSCI (gavinprod.com) 60> add extract dmp2,exttrailsource /opt/oracle/ggate/dirdat/ld
EXTRACT added.

   Replicat 进程的状态包括Stopped(正常停止),Starting(正在启动),Running(正在运行),Abended(Abnomal End的缩写,标示异常结束)。 

Step2. 定义dump目录

 

GGSCI (gavinprod.com) 62> add rmttrail /opt/oracle/ggate/dirdat/ld, extract dmp2
RMTTRAIL added.

5.Trail文件

Step3. 定义dump参数

   作用:存储事务变化信息(DDL和DML事务操作记录)

9159.com 6

   主库上的trail文件是可选的

GGSCI (gavinprod.com) 71> view params DMP2

extract dmp2
userid ggate@gavinprod, password oracle
rmthost odellprod.com, mgrport 7809
rmttrail /opt/oracle/ggate/dirdat/lt
passthru
table source_prod.*;

   备库上的trail文件是必须的(因为Replicat进程需要读取该文件中的DDL或DML SQL用来应用)

9159.com 7

   如果在主库上面定义了PUMP进程,那么就需要在主库上创建trail文件,因为PUMP进程将主库上的trail文件以块级别传输给网络上的从库。

 

9159.com 8四、Replicat Process


创建Replicat Process

Step1. 添加replicat程序

GGSCI (odellprod.com) 8> add replicat rep2, exttrail /opt/oracle/ggate/dirdat/ld, checkpointtable ggate.checkpoint
REPLICAT added.

Step2. 定义replicat参数

9159.com 9

GGSCI (odellprod.com) 11> view params REP2

replicat rep2
ASSUMETARGETDEFS
userid ggate@odellprod,password oracle
discardfile /opt/oracle/ggate/dirdat/rep2_discard.txt, append, megabytes 10
map source_prod.*, target target_prod.*;

9159.com 10

 

9159.com 11五、测试


  1. 在源数据端,创建测试数据

9159.com 12

CREATE TABLE source_prod.bxj_test_ogg_dump
(
   test_date          DATE,
   test_description   VARCHAR2 (100)
);

INSERT INTO source_prod.bxj_test_ogg_dump VALUES (sysdate,'test goldendate data transfer by extract/dump/replicat');

9159.com 13

  1. Source Database,进程和文件

9159.com 14

GGSCI (gavinprod.com) 17> info all

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

MANAGER     RUNNING                                           
EXTRACT     RUNNING     DMP2        00:00:00      00:00:07    
EXTRACT     RUNNING     EXT1        00:00:00      00:00:08    
EXTRACT     RUNNING     EXT2        00:00:00      00:00:06

9159.com 15

9159.com 16

  1. Target Database,进程和文件 

9159.com 17

GGSCI (odellprod.com) 6> info all

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

MANAGER     RUNNING                                           
REPLICAT    RUNNING     REP1        00:00:00      00:00:03    
REPLICAT    RUNNING     REP2        00:00:00      00:00:03  

9159.com 18

9159.com 19

  1. Checkpoint表

9159.com 20

 

Thanks and Regards

参考:shined -

参考:msdnchina -

9159.com 21

本文由9159.com发布于编程,转载请注明出处:进程之间通讯的几种方法,复制进程)

关键词: