首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用PHP在Microsoft服务器中克隆数据库?

如何使用PHP在Microsoft服务器中克隆数据库?
EN

Database Administration用户
提问于 2019-08-09 12:16:32
回答 3查看 950关注 0票数 0

我正在创建一个门户,用户可以在其中创建b2c或b2b存储本身,因此我需要克隆示例数据库来执行任务。在MSSQL中克隆数据库看起来并不简单。如果有人知道解决办法,请帮忙。

代码语言:javascript
复制
$sql = "RESTORE DATABASE test2 FROM DISK=N'/var/pathto/TEST.bak'
        WITH REPLACE, RECOVERY
        , MOVE 'TEST' TO '/var/pathto/TEST.mdf'
        , MOVE 'TEST_log' TO '/var/pathto/TEST_log.ldf'";
$stmt   =   sqlsrv_query($conn, $sql);
if($stmt === false) 
{
    echo ''; print_r(sqlsrv_errors()); echo ''; 
    die(); 
}else
{
    exit('executedd.');
}

我的剧本怎么了?

*

经过几个小时的研究,下面的脚本正在工作,但仍然显示在中恢复,检查附带的屏幕截图。

代码语言:javascript
复制
$sql = "CREATE DATABASE test9";
$stmt   =   sqlsrv_query($conn, $sql);
if($stmt === false) 
{
    echo ''; print_r(sqlsrv_errors()); echo ''; 
    die(); 
}else
{
    //echo ('executedd.');
}

$sql = "USE test9";
$stmt   =   sqlsrv_query($conn, $sql);
if($stmt === false) 
{
    echo ''; print_r(sqlsrv_errors()); echo ''; 
    die(); 
}else
{
    //echo ('executedd.');
}

$sql = "BACKUP DATABASE test9 TO DISK = '/var/opt/mssql/data/test9.bak'";
$stmt   =   sqlsrv_query($conn, $sql);
if($stmt === false) 
{
    echo ''; print_r(sqlsrv_errors()); echo ''; 
    die(); 
}else
{
    //echo ('executedd.');
}

$sql = "RESTORE DATABASE test9 FROM DISK='/var/opt/mssql/data/test4.bak'
        WITH REPLACE, RECOVERY
        , MOVE 'test4' TO '/var/opt/mssql/data/test9.mdf'
        , MOVE 'test4_log' TO '/var/opt/mssql/data/test9_log.ldf'";
$stmt   =   sqlsrv_query($conn, $sql);
if($stmt === false) 
{
    echo ''; print_r(sqlsrv_errors()); echo ''; 
    die(); 
}else
{
    //echo ('executedd.');
}
exit;
EN

回答 3

Database Administration用户

发布于 2019-08-09 12:26:59

您的最佳选择是接受并恢复数据库的备份。如果您的示例数据库是相当静态的,那么我建议进行一个黄金标准备份并使用它。如果是在不断修改,那么采取备份,然后恢复它的现场应该是足够的。

代码语言:javascript
复制
BACKUP DATABASE [Sample] TO DISK=N''

RESTORE DATABASE [TargetName] FROM DISK=N''
WITH REPLACE, RECOVERY
, MOVE 'file1' TO ''
, MOVE 'log1' TO ''

只需将这些命令动态化并授予用于此db_creator和db_backupoperator的任何用户即可。

但是,该命令假定不存在该命令。您可以通过查询sys.databases来检查数据库的存在。如果需要覆盖现有数据库,则需要在启动还原之前将每个人踢出。

以上这两个命令都应该运行以避免冲突。

这个命令将一个数据库设置为single_user模式,这将把每个人都踢出去。但是,第一个连接将接受唯一允许的连接,因此您应该运行这个连接,然后立即运行restore命令,最好是在同一个事务中运行。

代码语言:javascript
复制
ALTER DATABASE [TargetName]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
票数 1
EN

Database Administration用户

发布于 2019-08-13 10:28:43

我找到了以下克隆任何数据库的解决方案,它真的对我有用。希望这对其他人也有帮助。

代码语言:javascript
复制
/*create table */
$newDatabase        =   'store_live2';
$copyFromDatabase   =   'import_test';

$sql = "CREATE DATABASE ".$newDatabase;
$stmt   =   sqlsrv_query($conn, $sql);
if($stmt === false) 
{
    $error = sqlsrv_errors();
    echo $error[0]['SQLSTATE'].': '.$error[0]['message'];
    //echo ''; print_r(sqlsrv_errors()); echo ''; 
    die(); 
}

$sql = "USE ".$newDatabase;
$stmt   =   sqlsrv_query($conn, $sql);
if($stmt === false) 
{
    echo ''; print_r(sqlsrv_errors()); echo ''; 
    die(); 
}else
{
    //echo ('executedd.');
}

/* select database from where we wants to copy the data */
$sql    =   "SELECT TABLE_NAME 
            FROM ".$copyFromDatabase.".INFORMATION_SCHEMA.TABLES";
$stmt   =   sqlsrv_query($conn, $sql);
if($stmt === false) 
{
    echo ''; print_r(sqlsrv_errors()); echo ''; 
    die(); 
}else
{
        $arrSql = [];
    while( $tables = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
        /* to copy only structure use WHERE 1=2 and if want structure with data then remove WHERE 1=2 */
        $_arrSql[]  =   "SELECT *
                        INTO ".$_newStoreDatabase.".dbo.".$_tables['TABLE_NAME']."
                        FROM ".$_copyFromDatabase.".dbo.".$_tables['TABLE_NAME']."  WHERE 1=2";
    }

    /* run all queries at once */
    $sql = implode($arrSql, ';');
    $stmt   =   sqlsrv_query($conn, $sql);
    if($stmt === false) 
    {
        echo ''; print_r(sqlsrv_errors()); echo ''; 
        die(); 
    }else
    {
        echo ('executed.
');
    }
}

$connOptions = array("Database"=>$newDatabase, "UID"=>'test', "PWD"=>'test123'); 
$conn = sqlsrv_connect($serverName, $connOptions);
if($conn){
    echo "

Database {$newDatabase} has been connected.";
}else{
    exit('Database Not Connected!');
}

谢谢,

票数 0
EN

Database Administration用户

发布于 2019-08-16 09:13:38

现在,我打破了简单的外壳,开发了一个脚本,它可以用索引、约束和所有其他配置动态地克隆数据库。虽然很难,但我做到了。

代码语言:javascript
复制
$sql = "USE [master]; BACKUP DATABASE test TO DISK='/var/pathtodir/test.bak'";
$stmt   =   sqlsrv_query($conn, $sql);
if($stmt === false) 
{
    echo ''; print_r(sqlsrv_errors()); echo ''; 
    die(); 
}else
{
    //echo ('executedd.');
}

$sql = "USE [master]; RESTORE DATABASE test5 FROM DISK='/var/pathtodir/test.bak'
        WITH REPLACE, RECOVERY
        , MOVE 'test' TO '/var/pathtodir/test5.mdf'
        , MOVE 'test_log' TO '/var/pathtodir/test5_log.ldf'";
$stmt   =   sqlsrv_query($conn, $sql);
if($stmt === false) 
{
    echo ''; print_r(sqlsrv_errors()); echo ''; 
    die(); 
}else
{
    //echo ('executedd.');
}

$sql = "USE test5";
$stmt   =   sqlsrv_query($conn, $sql);
if($stmt === false) 
{
    echo ''; print_r(sqlsrv_errors()); echo ''; 
    die(); 
}else
{
    echo ('executedd.');
} 
票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/244973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档