ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

c# – 在每天同步的不同机器上有两个SQL Server数据库的好方法吗?

2019-07-01 09:25:28  阅读:276  来源: 互联网

标签:php c sql-server synchronization winscp


我想要实现的是两个不同的SQL Server数据库,在两个不同的服务器上运行相同的SQL Server版本(SQL Server 2008 R2 RTM – 10.50.1600.1),每天进行同步.同步意味着仅将新数据(或甚至所有数据)从两个(“父”数据库)之一传输到另一个(“子”数据库).我们希望父母将其shema以及所有数据强制给孩子.

我已经尝试过的

知道这两台机器在Windows Server 2012 R2上运行我已经尝试使用以下工具实现解决方案(尽管我在SQL Server方面不是专家).

> PHP v7.2
> ExeOutputforPHP(https://www.exeoutput.com/)
> WinSCP(用于构建ftp方法https://winscp.net)
> Schemazen(https://github.com/sethreno/schemazen)

所以我会这样做:

>使用PHP(服务器,用户,通行证,数据库等)读取配置文件.
>当PHP不会产生任何错误时,我会触发schemazen脚本方法.
>当一切顺利时,我会触发winscp的ftp方法到远程服务器

这将是出口方

现在为进口方

>我将找到ftp目录并使用Schemazen create方法,我将通过读取配置文件再次导入数据.

出口边码

$iniConfig = parse_ini_file('..\conf.ini', true);
if ($iniConfig) {
    echo PHP_EOL.'Configuration file found in '.realpath('..\conf.ini').PHP_EOL;
    define('EXPORT_HOST', $iniConfig['export']['host']);
    define('EXPORT_DB', $iniConfig['export']['db']);
    define('EXPORT_DIR', $iniConfig['export']['dir']);
    define('FTP_HOST', $iniConfig['ftp']['host']);
    define('FTP_PATH_TO_SAVE', $iniConfig['ftp']['path']);
    define('FTP_USERNAME', $iniConfig['ftp']['user']);
    define('FTP_PASS', $iniConfig['ftp']['pass']);
    define('PATH_TO_SAVE', $iniConfig['ftp']['path']);

    $output     = [];
    $return_var = 0;
    $credsFlag  = '';

    if ($iniConfig['export']['user'] && $iniConfig['export']['pass']) {
        define('EXPORT_USER', $iniConfig['export']['user']);
        define('EXPORT_PASS', $iniConfig['export']['pass']);
        $credsFlag = ' -u '.EXPORT_USER.' -p '.EXPORT_PASS;
    } else {
        echo PHP_EOL.'Please Define the Username and Password for connection to the Database!'.PHP_EOL;
        die();
    }

    $connArray  = [
        'Database' => EXPORT_DB,
        'UID'      => EXPORT_USER,
        'PWD'      => EXPORT_PASS,
    ];
    $connection = sqlsrv_connect(EXPORT_HOST, $connArray);
    if (!$connection) {
        echo PHP_EOL.'Could not Connect to the Database!' . PHP_EOL . 'We received the following tried to connect:' . PHP_EOL;
        print_r(sqlsrv_errors());
        die();
    }

    $query  = "select table_name from information_schema.tables where table_catalog = '" . EXPORT_DB . "'";
    $tables = [];
    $rs     = sqlsrv_query($connection, $query);
    while (($rd = sqlsrv_fetch_array($rs, SQLSRV_FETCH_ASSOC)) !== false) {
        if ($rd) {
            array_push($tables, $rd);
        }
    }

    sqlsrv_close($connection);
    $dataTablesString = '--dataTables=';
    foreach ($tables as $table) {
        $dataTablesString .= $table['table_name'].',';
    }

    exec('scriptor\SchemaZen.exe script -s '.EXPORT_HOST.' -b '.EXPORT_DB.$credsFlag.' -d '.EXPORT_DIR.' -o '.$dataTablesString, $output, $return_var);
    if (-1 === $return_var) {
        $file = fopen('ftp_script.txt', 'w+');
        if ($file) {
            $ftpStringToWrite = 'open ftp://'.FTP_USERNAME.':'.FTP_PASS.'@'.FTP_HOST.'/'.PHP_EOL.'cd '.FTP_PATH_TO_SAVE.PHP_EOL.'put '.EXPORT_DIR.'\*'.PHP_EOL.'exit';
            $writer           = fwrite($file, $ftpStringToWrite);
            if ($writer) {
                fclose($file);
                unset($output);
                exec('ftp\WinSCP.com /script=ftp_script.txt', $output, $return_var);
                if (0 === $return_var) {
                    echo PHP_EOL.'Backup Exported and Transfered via FTP.'.PHP_EOL;
                }
            }
        }
    }
}

导入边码

<?php
if ($iniConfig = parse_ini_file('../conf.ini', true)) {
    define('IMPORT_HOST', $iniConfig['import']['host']);
    define('IMPORT_DB', $iniConfig['import']['db']);
    define('IMPORT_DB_AFTER', $iniConfig['settings']['databaseAfterFix']);
    $credsFlags = '';
    if ($iniConfig['import']['user'] && $iniConfig['import']['pass']) {
        define('IMPORT_USER', $iniConfig['import']['user']);
        define('IMPORT_PASS', $iniConfig['import']['pass']);
        $credsFlags = ' -u '.IMPORT_USER.' -p '.IMPORT_PASS;
    } else {
        echo PHP_EOL.'Please Define the Username and Password for connection to the Database!'.PHP_EOL;
        die();
    }
    $output     = [];
    $return_var = 0;
    exec('scriptor\SchemaZen.exe create -s '.IMPORT_HOST.$credsFlags.' -o -b '.IMPORT_DB. ' -d ../../DBMigrate/'.$iniConfig['ftp']['path'].'', $output, $return_var);
    foreach ($output as $message) {
        echo $message.PHP_EOL;
    }
    if (0 !== $return_var) {
        $error_log = fopen($iniConfig['settings']['errorlog'], 'a+');
        if ($error_log) {
            foreach ($output as $error) {
                $writer = fwrite($error_log, '['.date('Y-m-d h:i:s').']'.$error.PHP_EOL);
            }
            $notify = mail($iniConfig['settings']['mail'], 'Import Error Encoutered!', 'Errors in Import of the Server.Please Check an error log should have been Created inside the folder /Data of the importer!');
            if ($notify) {
                echo PHP_EOL.'Mail sent about errors!'.PHP_EOL;
            }
            if ($writer) {
                echo PHP_EOL.'Created Error LOg Please Check!'.PHP_EOL;
            }
        }
    }
}

问题

最大的问题是我在我的本地环境中开发了这个测试,我在运行不同的SQL Server版本,当我尝试在实时服务器内的暂存环境中进行测试时遇到了以下问题https://github.com/sethreno/schemazen/issues/141

我真的很感激任何好的替代方案(特别是在SQL Server Managing Studio中内置工具,但我需要一些指导),或者可以应用于Schemazen的任何更正,因为它是一个开源项目来纠正问题.

解决方法:

根据您的要求,您可以简单地尝试backup and restore,这似乎满足您的要求.或者尝试Replication但这大大增加了复杂性.

还有各种工具可以做到这一点.如果你能为他们支付Redgate工作相当不错.我确定也有免费的,但我没有经验.

我不建议你自己滚动.

标签:php,c,sql-server,synchronization,winscp
来源: https://codeday.me/bug/20190701/1345677.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有