`
junge8618
  • 浏览: 121049 次
  • 性别: Icon_minigender_1
  • 来自: 邵阳
社区版块
存档分类
最新评论

数据库同步

 
阅读更多
1.同步脚本
#!/bin/bash

CURRENT_DIR="`pwd`";
DB_CONFIGURE_FILE="${CURRENT_DIR}/DatabaseConfigure.properties";
LOG_DIR="${CURRENT_DIR}/log";
LOG_FILE="${LOG_DIR}/main.log";

EXP_PARA_OUTPUT_DATA_FILE="${CURRENT_DIR}/oradb.dmp";
EXP_PARA_OUTPUT_LOG_FILE="${CURRENT_DIR}/log/output.log";
IMP_PARA_OUTPUT_LOG_FILE="${CURRENT_DIR}/log/input.log";

BACKUP_DIR="${CURRENT_DIR}/backup";
DATAFILE_BACKUP_DIR="${BACKUP_DIR}/datafile";
LOG_BACKUP_DIR="${BACKUP_DIR}/log";

#没有找到数据库配置文件
EXIT_CONFIGURE_FILE_NOT_FOUND="The Database Configure File not Found,the Process will Exit."
#数据库配置文件配置项有误
EXIT_CONFIGURE_FILE_ERROR="The Database Configure File is Incorrect.";

#导出成功总数
EXP_SUCCESS_NUM_RECORD="0";
#导出失败总数
EXP_FAIL_NUM_RECORD="0";
#导入成功总数
IMP_SUCCESS_NUM_RECORD="0";
#导入失败总数
IMP_FAIL_NUM_RECORD="0";


#脚本退出接口
#输入参数:
#  1.exit_code:退出码
#  2.exit_message:退出消息
function exitScript()
{
    exit_code=$1;
    exit_message=$2;
   
    [ "_${exit_code}" != "_0" ] && printMsg "[ERROR]${exit_message}";
    [ "_${exit_code}" = "_0" ] && printMsg "[SUCCESSFUL]${exit_message}";
   
    exit ${exit_code};
}

function printMsg()
{
    message=$1;
    echo "${message}" | tee -a ${LOG_FILE};
}

#函数功能:
#  1.创建日志目录和日志文件
#  2.读取数据库配置文件
#  3.检查导入数据库和导出数据库是否可以连接
function init()
{
    [ ! -d ${LOG_DIR} ] && mkdir -p ${LOG_DIR};
   
    [ ! -d ${BACKUP_DIR} ] && mkdir -p ${BACKUP_DIR};
   
    [ ! -d ${DATAFILE_BACKUP_DIR} ] && mkdir -p ${DATAFILE_BACKUP_DIR};
   
    [ ! -d ${LOG_BACKUP_DIR} ] && mkdir -p ${LOG_BACKUP_DIR};
   
    #备份数据文件
    [ -f ${EXP_PARA_OUTPUT_DATA_FILE} ] && mv ${EXP_PARA_OUTPUT_DATA_FILE} ${DATAFILE_BACKUP_DIR};
   
    #备份日志文件
    [ -f ${LOG_FILE} ] && mv ${LOG_FILE} ${LOG_BACKUP_DIR};
    [ -f ${EXP_PARA_OUTPUT_LOG_FILE} ] && mv ${EXP_PARA_OUTPUT_LOG_FILE} ${LOG_BACKUP_DIR};
    [ -f ${IMP_PARA_OUTPUT_LOG_FILE} ] && mv ${IMP_PARA_OUTPUT_LOG_FILE} ${LOG_BACKUP_DIR};
   
    [ ! -f ${LOG_FILE} ] && touch ${LOG_FILE};
   
    #将日志置空
    echo "At `date '+%Y-%m-%d %H:%M:%S'` Begin to Export and Import Data." > ${LOG_FILE};
   
    readConfig
   
    #检查导出数据库是否可以连接
    printMsg "Check the Connection of Database(${EXP_USERNAME}/${EXP_PASSWORD}@${EXP_DATABASE_IP}:${EXP_DATABASE_PROT}/${EXP_SID})";
    result=`checkDatabaseConn ${EXP_USERNAME} ${EXP_PASSWORD} ${EXP_DATABASE_IP} ${EXP_DATABASE_PROT} ${EXP_SID}`;
    if [ "_${result}" == "_0" ]
    then
        printMsg "Check the Connection successfully.";
    else
        exitScript 1 "Check the Connection failed,the Process will Exit.";
    fi;
   
    #检查导入数据库是否可以连接
    printMsg "Check the Connection of Database(${IMP_USERNAME}/${IMP_PASSWORD}@${IMP_DATABASE_IP}:${IMP_DATABASE_PROT}/${IMP_SID})";
    result=`checkDatabaseConn ${IMP_USERNAME} ${IMP_PASSWORD} ${IMP_DATABASE_IP} ${IMP_DATABASE_PROT} ${IMP_SID}`;
    if [ "_${result}" == "_0" ]
    then
        printMsg "Check the Connection successfully.";
    else
        exitScript 1 "Check the Connection failed,the Process will Exit.";
    fi;
   
    printMsg "";
}

#读取数据库配置文件
function readConfig()
{
    [ ! -f ${DB_CONFIGURE_FILE} ] && exitScript 1 "${EXIT_CONFIGURE_FILE_NOT_FOUND}"
   
    IMP_USERNAME="`grep 'IMP_USERNAME' ${DB_CONFIGURE_FILE} | awk -F"=" '{print $2}'`";
    IMP_PASSWORD="`grep 'IMP_PASSWORD' ${DB_CONFIGURE_FILE} | awk -F"=" '{print $2}'`";
    IMP_DATABASE_IP="`grep 'IMP_DATABASE_IP' ${DB_CONFIGURE_FILE} | awk -F"=" '{print $2}'`";
    IMP_DATABASE_PROT="`grep 'IMP_DATABASE_PROT' ${DB_CONFIGURE_FILE} | awk -F"=" '{print $2}'`";
    IMP_SID="`grep 'IMP_SID' ${DB_CONFIGURE_FILE} | awk -F'=' '{print $2}'`";

    EXP_USERNAME="`grep 'EXP_USERNAME' ${DB_CONFIGURE_FILE} | awk -F"=" '{print $2}'`";
    EXP_PASSWORD="`grep 'EXP_PASSWORD' ${DB_CONFIGURE_FILE} | awk -F"=" '{print $2}'`";
    EXP_DATABASE_IP="`grep 'EXP_DATABASE_IP' ${DB_CONFIGURE_FILE} | awk -F"=" '{print $2}'`";
    EXP_DATABASE_PROT="`grep 'EXP_DATABASE_PROT' ${DB_CONFIGURE_FILE} | awk -F"=" '{print $2}'`";
    EXP_SID="`grep 'EXP_SID' ${DB_CONFIGURE_FILE} | awk -F"=" '{print $2}'`";
      
    [ -z ${IMP_USERNAME} ] || [ -z ${IMP_PASSWORD} ] || [ -z ${IMP_DATABASE_IP} ] || [ -z ${IMP_DATABASE_PROT} ] || [ -z ${IMP_SID} ] || [ -z ${EXP_USERNAME} ] || [ -z {EXP_PASSWORD} ] || [ -z ${EXP_DATABASE_IP} ] || [ -z ${EXP_DATABASE_PROT} ] || [ -z ${EXP_SID} ] && exitScript 1 "${EXIT_CONFIGURE_FILE_ERROR}"  

}
#检查使用指定的用户、密码是否可以登陆到指导的数据库
#输入参数:
#  $1 登陆数据库的用户名
#  $2 登陆密码
#  $3 数据库所在主机的ip
#  $4 数据库的监听端口
#  $5 数据库实例名
#输出参数
# 返回1:数据库连接失败
# 返回0:数据库连接成功
function checkDatabaseConn()
{
    USERNAME=$1;
    PASSWORD=$2;
    DATABASE_IP=$3;
    DATABASE_PORT=$4;
    DATABASE_SID=$5;

    sqlplus "${USERNAME}/${PASSWORD}@${DATABASE_IP}:${DATABASE_PROT}/${DATABASE_SID}" <<EOF > /dev/null 2>&1

    exit;
EOF
    if [ $? != 0 ]
    then
        echo "1";
    fi;
   
    echo "0";   
}

function expData()
{
    USERNAME=$1;
    PASSWORD=$2;
    DATABASE_IP=$3;
    DATABASE_PORT=$4;
    DATABASE_SID=$5;
   
    exp ${USERNAME}/${PASSWORD}@${DATABASE_IP}:${DATABASE_PORT}/${DATABASE_SID} file=${EXP_PARA_OUTPUT_DATA_FILE} log=${EXP_PARA_OUTPUT_LOG_FILE} owner=${USERNAME} buffer=4096000 feedback=10000 > /dev/null 2>&1
   
    LAST_LINE="`tail -n 1 ${EXP_PARA_OUTPUT_LOG_FILE}`";
    SUCCESS_FLAG="`echo "${LAST_LINE}" | grep " successfully"`";
    if [ ! -n "${SUCCESS_FLAG}" ]
    then
        #导出失败,打印错误信息并退出。
        exitScript 1 "${LAST_LINE},want know detailed information, please reading the output.log";
    fi;
   
    EXP_SUCCESS_NUM_RECORD="0";
    for SINGLE_TABLE_NUM_SUCCESS in `grep "rows exported" ${EXP_PARA_OUTPUT_LOG_FILE} | awk '{print $1}'`
    do
        EXP_SUCCESS_NUM_RECORD=`expr ${EXP_SUCCESS_NUM_RECORD} + ${SINGLE_TABLE_NUM_SUCCESS}`;
    done;
   
    #导出成功

    printMsg "${LAST_LINE} total ${EXP_SUCCESS_NUM_RECORD} records.";
}

function impData()
{
    USERNAME=$1;
    PASSWORD=$2;
    DATABASE_IP=$3;
    DATABASE_PORT=$4;
    DATABASE_SID=$5;
    FROM_USERNAME=$6;
   
    sqlplus ${USERNAME}/${PASSWORD}@${DATABASE_IP}:${DATABASE_PORT}/${DATABASE_SID} <<EOF > /dev/null 2>&1
    declare   
     --查询用户下所有外键约束名和相应的表名      
     cursor c_Constraints is
     select t.table_name,t.constraint_name from user_constraints t where t.constraint_type='R';
     --查询用户下的所有表名
     cursor c_User_tables is
     select t.table_name  from user_tables t;
    begin       
     ----遍历游标 将用户下的所有外键约束设为失效的。
     for c_Const in c_Constraints loop
        execute immediate 'ALTER TABLE '|| c_Const.table_name||' DISABLE CONSTRAINT '||c_Const.constraint_name;           
     end loop;
    
     ----遍历游标,截断用户下的所有表中的数据
     for c_table in c_User_tables loop
        execute immediate 'truncate table '||c_table.table_name;
     end loop;    
    
     ----遍历游标 将用户下的所有外键约束设为有效的。
     for c_Const in c_Constraints loop
        execute immediate 'ALTER TABLE '|| c_Const.table_name||' ENABLE CONSTRAINT '||c_Const.constraint_name;           
     end loop;       
    end;
    /
    commit;

    exit;
EOF

    imp ${USERNAME}/${PASSWORD}@${DATABASE_IP}:${DATABASE_PORT}/${DATABASE_SID} file=${EXP_PARA_OUTPUT_DATA_FILE} log=${IMP_PARA_OUTPUT_LOG_FILE} fromuser=${FROM_USERNAME} touser=${USERNAME} buffer=2048000 commit=y ignore=y feedback=10000 > /dev/null 2>&1
   
    IMP_SUCCESS_NUM_RECORD="0";
    for SINGLE_TABLE_NUM_SUCCESS in `grep "rows imported" ${IMP_PARA_OUTPUT_LOG_FILE} | awk '{print $1}'`
    do
        IMP_SUCCESS_NUM_RECORD=`expr ${IMP_SUCCESS_NUM_RECORD} + ${SINGLE_TABLE_NUM_SUCCESS}`;
    done;
   
    #printMsg "The Import's Total Number is ${IMP_SUCCESS_NUM_RECORD}";
       
    if [ ${EXP_SUCCESS_NUM_RECORD} -eq ${IMP_SUCCESS_NUM_RECORD} ] 
    then
        printMsg "Import all data successfully,total ${IMP_SUCCESS_NUM_RECORD} records.";
    else
        IMP_FAIL_NUM_RECORD=`expr ${EXP_SUCCESS_NUM_RECORD} - ${IMP_SUCCESS_NUM_RECORD}`;
        printMsg "Succeed numbers:${IMP_SUCCESS_NUM_RECORD},Failed numbers:${IMP_FAIL_NUM_RECORD},want be know detailed information, please reading the input.log";
    fi;
}

function main()
{
    init
   
    printMsg "Export Data from Database(${EXP_DATABASE_IP})";
    expData ${EXP_USERNAME} ${EXP_PASSWORD} ${EXP_DATABASE_IP} ${EXP_DATABASE_PROT} ${EXP_SID}
   
    printMsg "Import Data to Database(${IMP_DATABASE_IP}) form Database(${EXP_DATABASE_IP})";
    impData ${IMP_USERNAME} ${IMP_PASSWORD} ${IMP_DATABASE_IP} ${IMP_DATABASE_PROT} ${IMP_SID} ${EXP_USERNAME}
   
    #echo "At `date '+%Y-%m-%d %H:%M:%S'` Complete Data Synchronization." > ${LOG_FILE};
}

main


2。配置文件
#数据导入数据库配置
IMP_USERNAME=wjh
IMP_PASSWORD=wjh
IMP_DATABASE_IP=10.38.132.81
IMP_DATABASE_PROT=1521
IMP_SID=ORACLE

#数据导出数据库配置
EXP_USERNAME=myvpn
EXP_PASSWORD=myvpnpwd
EXP_DATABASE_IP=10.38.202.147
EXP_DATABASE_PROT=1521
EXP_SID=sysdb
分享到:
评论

相关推荐

    基于Java的数据库同步工具设计源码

    数据库同步工具:基于Java开发,包含22个文件,包括9个Java类文件、2个Markdown文档、2个JAR包文件、2个XML配置文件、2个Properties配置文件、1个.gitignore文件、1个LICENSE文件、1个PNG图像文件、1个GIF图像文件、...

    WinCC SQL SERVER 数据库实现数据库同步

    即使程序没有实现读写分离,数据库同步之后也能够作为双机热备的方案,此时对数据库同步时间的实施性要求就不高了 4. 实现效果 内网A、B两个Sqlserver数据库服务器 A服务器某库表结构、数据、存储过程、自定义函数...

    WinCC_SQL数据库实现数据库同步

    ### WinCC与SQL Server数据库同步实现 #### 一、引言 在现代工业自动化领域,数据的实时性和一致性显得尤为重要。对于使用WinCC (Windows Control Center) 的应用场景来说,能够实现多个站点之间的数据同步是非常...

    开源免费数据库同步工具SQL-DBDiff_V0.4

    SQL-DBDiff_V0.4是一款开源且免费的数据库同步工具,主要针对那些需要在不同数据库之间进行数据比对和迁移的用户。该工具具备全英文界面,虽然可能对中文用户造成一定的语言障碍,但其丰富的配置选项为熟悉英文的...

    数据库同步工具(跨平台)

    数据库同步工具是IT行业中至关重要的一个环节,尤其是在大数据管理和分布式系统中。标题提到的"数据库同步工具(跨平台)"是指能够跨越不同操作系统环境(如Windows、Linux、macOS等)进行数据库数据同步的软件解决...

    数据库同步工具

    数据库同步是IT领域中一个关键的操作,特别是在大数据管理和分布式系统中。它涉及到将一个数据库中的数据实时或定期地复制到另一个数据库,以确保数据的一致性和可用性。在这个场景中,我们讨论的是一个名为"数据库...

    数据库同步软件DBSync V1.9 免费版

    DBSync是一款通用型的数据库同步软件,能侦测数据库之间的差异,能实时同步差异数据,从而使双方始终保持一致。支持各种数据库,支持异构同步、增量同步。 主要特点: ● 非侵入式,独立运行 ● 支持各种数据库 ● ...

    数据库同步的操作步骤

    ### 数据库同步的操作步骤 #### 一、理解数据库同步的重要性 数据库同步是在不同的数据库实例之间复制数据的过程,目的是为了保持各个数据库之间的数据一致性。这对于分布式系统尤为重要,因为这些系统通常包含多...

    SQL Server 2008 R2 主从数据库同步

    SQL Server 2008 R2 主从数据库同步 SQL Server 2008 R2 主从数据库同步是高可用性技术之一,通过配置数据库属性和事务日志传送,实现主从数据库之间的数据同步。本文将详细介绍 SQL Server 2008 R2 主从数据库同步...

    跨数据库同步数据

    在IT行业中,数据库同步是一个重要的任务,特别是在分布式系统和大数据环境中。"跨数据库同步数据"这一主题涉及到如何在不同的数据库之间有效地迁移和更新信息,确保数据的一致性和完整性。在这个过程中,工具和技术...

    数据库同步软件【官方】免费版

    SyncNavigator数据库同步软件是一款 SQLSERVER,MYSQL 数据库同步软件。它为您提供一种简单智能的方式完成复杂的数据库数据同步,分发操作。 SyncNavigator 可以帮助您快速的完成数据库的数据同步。不需要专业的...

    C# Access数据库同步 服务端

    在IT行业中,数据库同步是一个重要的任务,特别是在分布式系统或者有多处数据存储的需求时。本项目聚焦于使用C#实现Access数据库的同步,特别是在服务端环境下。Access数据库由于其易用性和轻量级特性,常被用于小型...

    在VS2008下,利用c#在SQLSERVER2005实现两个数据库同步

    在这里,我们将创建一个Windows Forms应用,通过图形用户界面(GUI)触发数据库同步操作。 1. **创建Windows Forms项目** 在VS2008中,选择“文件”-&gt;“新建”-&gt;“项目”,然后选择“Windows Forms应用程序”。为...

    数据同步技术数据库同步,SQL2000同步,2000,同步,备份

    ### 数据库同步技术概述 数据库同步技术是确保不同数据库之间数据一致性的关键技术之一。对于企业级应用而言,特别是那些需要在多个地理位置之间共享数据的应用场景,数据库同步变得尤为重要。通过数据库同步,可以...

    数据库同步 数据库同步

    数据库同步是IT领域中一个关键的概念,特别是在分布式系统和数据备份与恢复的场景下。它涉及到如何保持多个数据库实例间的数据一致性,确保在任何给定时间,这些数据库都具有相同或近乎相同的数据状态。让我们深入...

    数据库同步软件7.5.1

    数据库同步软件7.5.1是一款专为数据库管理和保护设计的高效工具,它集成了自动定时备份功能,能够有效地帮助用户确保数据的安全性和完整性。针对MySQL和SQL Server这两种广泛使用的数据库系统,该软件提供了定制化的...

    互联网数据库同步程序 delphi7

    标题“互联网数据库同步程序 Delphi7”涉及到的是一个利用Delphi7编程环境开发的数据库同步解决方案,主要用于在互联网上的两台计算机之间实现SQL Server 2000数据库的数据同步。这个程序的重要性和价值在于它能确保...

    MySql数据库同步复制

    MySQL 数据库同步复制是一种强大的技术,它允许两个或多个数据库实例之间保持数据一致性。这种功能在高可用性、灾难恢复和负载均衡场景中至关重要。在MySQL中,同步复制主要通过主从模式和双机互备模式来实现。 1. ...

    Oracle数据库同步技术

    Oracle数据库同步技术是确保数据在多个数据库之间保持一致的重要手段,尤其在分布式系统或灾难恢复策略中发挥着关键作用。Oracle提供了多种内置的数据同步解决方案,包括DataGuard、Streams、Advanced Replication...

Global site tag (gtag.js) - Google Analytics