我正在创建一个门户,用户可以在其中创建b2c或b2b存储本身,因此我需要克隆示例数据库来执行任务。在MSSQL中克隆数据库看起来并不简单。如果有人知道解决办法,请帮忙。
$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.');
}我的剧本怎么了?
*
经过几个小时的研究,下面的脚本正在工作,但仍然显示在中恢复,检查附带的屏幕截图。
$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;
发布于 2019-08-09 12:26:59
您的最佳选择是接受并恢复数据库的备份。如果您的示例数据库是相当静态的,那么我建议进行一个黄金标准备份并使用它。如果是在不断修改,那么采取备份,然后恢复它的现场应该是足够的。
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命令,最好是在同一个事务中运行。
ALTER DATABASE [TargetName]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;发布于 2019-08-13 10:28:43
我找到了以下克隆任何数据库的解决方案,它真的对我有用。希望这对其他人也有帮助。
/*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!');
}谢谢,
发布于 2019-08-16 09:13:38
现在,我打破了简单的外壳,开发了一个脚本,它可以用索引、约束和所有其他配置动态地克隆数据库。虽然很难,但我做到了。
$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.');
} https://dba.stackexchange.com/questions/244973
复制相似问题