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开发,包含22个文件,包括9个Java类文件、2个Markdown文档、2个JAR包文件、2个XML配置文件、2个Properties配置文件、1个.gitignore文件、1个LICENSE文件、1个PNG图像文件、1个GIF图像文件、...
即使程序没有实现读写分离,数据库同步之后也能够作为双机热备的方案,此时对数据库同步时间的实施性要求就不高了 4. 实现效果 内网A、B两个Sqlserver数据库服务器 A服务器某库表结构、数据、存储过程、自定义函数...
### WinCC与SQL Server数据库同步实现 #### 一、引言 在现代工业自动化领域,数据的实时性和一致性显得尤为重要。对于使用WinCC (Windows Control Center) 的应用场景来说,能够实现多个站点之间的数据同步是非常...
SQL-DBDiff_V0.4是一款开源且免费的数据库同步工具,主要针对那些需要在不同数据库之间进行数据比对和迁移的用户。该工具具备全英文界面,虽然可能对中文用户造成一定的语言障碍,但其丰富的配置选项为熟悉英文的...
数据库同步工具是IT行业中至关重要的一个环节,尤其是在大数据管理和分布式系统中。标题提到的"数据库同步工具(跨平台)"是指能够跨越不同操作系统环境(如Windows、Linux、macOS等)进行数据库数据同步的软件解决...
数据库同步是IT领域中一个关键的操作,特别是在大数据管理和分布式系统中。它涉及到将一个数据库中的数据实时或定期地复制到另一个数据库,以确保数据的一致性和可用性。在这个场景中,我们讨论的是一个名为"数据库...
DBSync是一款通用型的数据库同步软件,能侦测数据库之间的差异,能实时同步差异数据,从而使双方始终保持一致。支持各种数据库,支持异构同步、增量同步。 主要特点: ● 非侵入式,独立运行 ● 支持各种数据库 ● ...
### 数据库同步的操作步骤 #### 一、理解数据库同步的重要性 数据库同步是在不同的数据库实例之间复制数据的过程,目的是为了保持各个数据库之间的数据一致性。这对于分布式系统尤为重要,因为这些系统通常包含多...
SQL Server 2008 R2 主从数据库同步 SQL Server 2008 R2 主从数据库同步是高可用性技术之一,通过配置数据库属性和事务日志传送,实现主从数据库之间的数据同步。本文将详细介绍 SQL Server 2008 R2 主从数据库同步...
在IT行业中,数据库同步是一个重要的任务,特别是在分布式系统和大数据环境中。"跨数据库同步数据"这一主题涉及到如何在不同的数据库之间有效地迁移和更新信息,确保数据的一致性和完整性。在这个过程中,工具和技术...
SyncNavigator数据库同步软件是一款 SQLSERVER,MYSQL 数据库同步软件。它为您提供一种简单智能的方式完成复杂的数据库数据同步,分发操作。 SyncNavigator 可以帮助您快速的完成数据库的数据同步。不需要专业的...
在IT行业中,数据库同步是一个重要的任务,特别是在分布式系统或者有多处数据存储的需求时。本项目聚焦于使用C#实现Access数据库的同步,特别是在服务端环境下。Access数据库由于其易用性和轻量级特性,常被用于小型...
在这里,我们将创建一个Windows Forms应用,通过图形用户界面(GUI)触发数据库同步操作。 1. **创建Windows Forms项目** 在VS2008中,选择“文件”->“新建”->“项目”,然后选择“Windows Forms应用程序”。为...
### 数据库同步技术概述 数据库同步技术是确保不同数据库之间数据一致性的关键技术之一。对于企业级应用而言,特别是那些需要在多个地理位置之间共享数据的应用场景,数据库同步变得尤为重要。通过数据库同步,可以...
数据库同步是IT领域中一个关键的概念,特别是在分布式系统和数据备份与恢复的场景下。它涉及到如何保持多个数据库实例间的数据一致性,确保在任何给定时间,这些数据库都具有相同或近乎相同的数据状态。让我们深入...
数据库同步软件7.5.1是一款专为数据库管理和保护设计的高效工具,它集成了自动定时备份功能,能够有效地帮助用户确保数据的安全性和完整性。针对MySQL和SQL Server这两种广泛使用的数据库系统,该软件提供了定制化的...
标题“互联网数据库同步程序 Delphi7”涉及到的是一个利用Delphi7编程环境开发的数据库同步解决方案,主要用于在互联网上的两台计算机之间实现SQL Server 2000数据库的数据同步。这个程序的重要性和价值在于它能确保...
MySQL 数据库同步复制是一种强大的技术,它允许两个或多个数据库实例之间保持数据一致性。这种功能在高可用性、灾难恢复和负载均衡场景中至关重要。在MySQL中,同步复制主要通过主从模式和双机互备模式来实现。 1. ...
Oracle数据库同步技术是确保数据在多个数据库之间保持一致的重要手段,尤其在分布式系统或灾难恢复策略中发挥着关键作用。Oracle提供了多种内置的数据同步解决方案,包括DataGuard、Streams、Advanced Replication...