数据库同步的方式有设置标志位同步方式、以时间戳同步的方式,对于一对一的同步这两种方式都满足,但是对于一对多的同步,则只能选择时间戳的同步方式了,但是已时间戳同步的方式的一个问题是如何可靠的保证数据可以不丢失的同步到数据库中。下面有两种方式
数据库同步的方式有设置标志位同步方式、以时间戳同步的方式,对于一对一的同步这两种方式都满足,但是对于一对多的同步,则只能选择时间戳的同步方式了,但是已时间戳同步的方式的一个问题是如何可靠的保证数据可以不丢失的同步到数据库中。下面有两种方式来保证以时间戳同步的可靠性。
1、计算服务器与客户端两台电脑的时间差,将该时间差记入在同步时间的比对当中,下图是使用kettle做的一个计算同步的时间差的思路:
该思路的xml代码为:
getLeadValue Normal 0 /downloadServerData/commonData
ID_BATCH Y ID_BATCH CHANNEL_ID Y CHANNEL_ID TRANSNAME Y TRANSNAME STATUS Y STATUS LINES_READ Y LINES_READ LINES_WRITTEN Y LINES_WRITTEN LINES_UPDATED Y LINES_UPDATED LINES_INPUT Y LINES_INPUT LINES_OUTPUT Y LINES_OUTPUT LINES_REJECTED Y LINES_REJECTED ERRORS Y ERRORS STARTDATE Y STARTDATE ENDDATE Y ENDDATE LOGDATE Y LOGDATE DEPDATE Y DEPDATE REPLAYDATE Y REPLAYDATE LOG_FIELD Y LOG_FIELD
ID_BATCH Y ID_BATCH SEQ_NR Y SEQ_NR LOGDATE Y LOGDATE TRANSNAME Y TRANSNAME STEPNAME Y STEPNAME STEP_COPY Y STEP_COPY LINES_READ Y LINES_READ LINES_WRITTEN Y LINES_WRITTEN LINES_UPDATED Y LINES_UPDATED LINES_INPUT Y LINES_INPUT LINES_OUTPUT Y LINES_OUTPUT LINES_REJECTED Y LINES_REJECTED ERRORS Y ERRORS INPUT_BUFFER_ROWS Y INPUT_BUFFER_ROWS OUTPUT_BUFFER_ROWS Y OUTPUT_BUFFER_ROWS
ID_BATCH Y ID_BATCH CHANNEL_ID Y CHANNEL_ID LOG_DATE Y LOG_DATE LOGGING_OBJECT_TYPE Y LOGGING_OBJECT_TYPE OBJECT_NAME Y OBJECT_NAME OBJECT_COPY Y OBJECT_COPY REPOSITORY_DIRECTORY Y REPOSITORY_DIRECTORY FILENAME Y FILENAME OBJECT_ID Y OBJECT_ID OBJECT_REVISION Y OBJECT_REVISION PARENT_CHANNEL_ID Y PARENT_CHANNEL_ID ROOT_CHANNEL_ID Y ROOT_CHANNEL_ID
ID_BATCH Y ID_BATCH CHANNEL_ID Y CHANNEL_ID LOG_DATE Y LOG_DATE TRANSNAME Y TRANSNAME STEPNAME Y STEPNAME STEP_COPY Y STEP_COPY LINES_READ Y LINES_READ LINES_WRITTEN Y LINES_WRITTEN LINES_UPDATED Y LINES_UPDATED LINES_INPUT Y LINES_INPUT LINES_OUTPUT Y LINES_OUTPUT LINES_REJECTED Y LINES_REJECTED ERRORS Y ERRORS LOG_FIELD N LOG_FIELD
0.0 0.0 10000 50 50 N Y 50000 Y N 1000 100 - 2012/11/16 13:59:51.117 - 2014/05/12 15:22:12.008 backupConn ${CLIENT_DATABASE_IP} ORACLE Native ${CLIENT_DATABASE_NAME} ${CLIENT_DATABASE_PORT} ${CLIENT_DATABASE_USERNAME} ${CLIENT_DATABASE_PASSWORD} FORCE_IDENTIFIERS_TO_LOWERCASE
N FORCE_IDENTIFIERS_TO_UPPERCASE
N IS_CLUSTERED
N PORT_NUMBER
${CLIENT_DATABASE_PORT} QUOTE_ALL_FIELDS
N SUPPORTS_BOOLEAN_DATA_TYPE
N USE_POOLING
N serverConn ${SERVER_DATABASE_IP} ORACLE Native ${SERVER_DATABASE_NAME} ${SERVER_DATABASE_PORT} ${SERVER_DATABASE_USERNAME} ${SERVER_DATABASE_PASSWORD} FORCE_IDENTIFIERS_TO_LOWERCASE
N FORCE_IDENTIFIERS_TO_UPPERCASE
N IS_CLUSTERED
N PORT_NUMBER
${SERVER_DATABASE_PORT} QUOTE_ALL_FIELDS
N SUPPORTS_BOOLEAN_DATA_TYPE
N USE_POOLING
N wardConn ${CLIENT_DATABASE_IP} ORACLE Native ${CLIENT_DATABASE_NAME} ${CLIENT_DATABASE_PORT} ${CLIENT_DATABASE_USERNAME} ${CLIENT_DATABASE_PASSWORD} FORCE_IDENTIFIERS_TO_LOWERCASE
N FORCE_IDENTIFIERS_TO_UPPERCASE
N INITIAL_POOL_SIZE
50 IS_CLUSTERED
N MAXIMUM_POOL_SIZE
500 PORT_NUMBER
${CLIENT_DATABASE_PORT} QUOTE_ALL_FIELDS
N SUPPORTS_BOOLEAN_DATA_TYPE
N USE_POOLING
Y 增加常量 增加常量 2 Y 计算器 Set Variables 2 Y 调用DB存储过程 调用DB存储过程 2 Y 调用DB存储过程 2 增加常量 Y 增加常量 2 计算器 Y Set Variables 2 SetVariable Y 1 none TIMEDIFF DOWNLOAD_SERVER_COMMON_DATA_LEAD JVM Y 118 273 Y 增加常量 Constant Y 1 none DIVIDEND Integer 86400000 -1 -1 388 241 Y 增加常量 2 Constant Y 1 none DEVIATION Integer 10000 -1 -1 364 362 Y 计算器 Calculator Y 1 none TEMP SUBTRACT LOCAL_DATE SERVER_DATE BigNumber -1 -1 N TEMP2 ADD TEMP DEVIATION BigNumber -1 -1 N TIMEDIFF DIVIDE TEMP2 DIVIDEND BigNumber -1 -1 N 251 272 Y 调用DB存储过程 DBProc Y 1 none serverConn F_GET_SYSDATE2INT SERVER_DATE BigNumber Y 140 134 Y 调用DB存储过程 2 DBProc Y 1 none wardConn F_GET_SYSDATE2INT LOCAL_DATE BigNumber Y 353 132 Y N
1)如果可以连接到Internet网中,则可以采用国际上的校时服务器去校对时间
2)如果在内网中且不能上网,则可以自己定义一台都可访问到的台式机作为NTP服务器,其他机子与该计算机教士即可,下面是window NTP校时服务器的设置。
可以参考文章:NTP服务同步时间方案