使用Azure Sql从副本C#应用程序创建数据库
我试图找出从数据库副本创建数据库的最佳方法 C#应用程序有用户注册成为网站用户,一旦注册获得批准,它需要查看主数据库并创建其直接副本。因此,在本例中,MainDB(主数据库的名称)具有为用户创建副本所需的所有模式。所以,当用户注册时,它将创建UserDB(用户副本数据库的名称) 现在我用下面的代码来做这件事使用Azure Sql从副本C#应用程序创建数据库,c#,sql,azure,azure-sql-database,azure-data-factory,C#,Sql,Azure,Azure Sql Database,Azure Data Factory,我试图找出从数据库副本创建数据库的最佳方法 C#应用程序有用户注册成为网站用户,一旦注册获得批准,它需要查看主数据库并创建其直接副本。因此,在本例中,MainDB(主数据库的名称)具有为用户创建副本所需的所有模式。所以,当用户注册时,它将创建UserDB(用户副本数据库的名称) 现在我用下面的代码来做这件事 SqlConnection cn; SqlCommand command; SqlDataReader dataReader;
SqlConnection cn;
SqlCommand command;
SqlDataReader dataReader;
cn.Open();
string dbName = UserDB;
command = new SqlCommand("CREATE DATABASE " + dbName + " AS COPY OF MainDB", cn);
command.CommandTimeout = 120;
dataReader = command.ExecuteReader();
cn.Close();
这是可行的,但在azure中填充所需的时间是如此不可预测,以至于我无法计算出在为新数据库创建用户时超时和抛出错误之前的合理等待时间
我想知道对于C#应用程序是否有更快的方法来实现这一点。是否可能将数据库的bacpac文件导入Azure数据工厂,并从此处创建数据库?但是我还没有找到一个使用C#应用程序运行代码的例子。我刚刚读到它读得更快,不确定是否正确
非常感谢您的帮助 如果我在查看代码后理解了这个问题,那么您正在创建一个USERDB,并且希望从MASTERDB获得USERDB中的模式和数据
您可以使用bacpac文件,bacpac文件只是一个ZIP文件,其中包含每个模式的数据。如果我是你,我可以将文件复制到blob,让ADF将数据复制到USERDB。这样做的好处是,我们可以在复制活动中实现并行性,并且USERDB将很快准备就绪 用户数据库必须是最新的吗?我问,因为如果性能是不可预测的,并且立即响应是重要的,那么您可以考虑提前在后台运行它,这样您就可以在待机时使用最近的DB。 它也是模式和数据吗?因为,如果只是模式,那么复制整个数据库似乎是过火了 数据库现在有多大?Bacpac文件适用于小型数据库,但一旦达到几百GB,祝您好运
很高兴进一步了解这一点我不确定从bacpac恢复数据库是否会显著加快。但恢复所需的时间间隔应该更小 以下C#代码将导入数据库:
using Microsoft.SqlServer.Dac;
var services = new DacServices (connectionString);
services.ImportBacpac (BacPackage.Load (fileName), restoredDatabaseName, cancellationToken);
ALTER DATABASE [@dbName] MODIFY (EDITION = @ edition, SERVICE_OBJECTIVE = @ ServiceObjective)
请注意,还原的数据库将以默认价格层还原。如果要恢复多个小型数据库,这一点非常重要,每个数据库将消耗约450美元
借助下面的sql命令,您可以找到原始数据库的价格层
SELECT
s.edition as [Edition],
s.service_objective as [ServiceObjective],
s.elastic_pool_name as [ElasticPoolName]
FROM
sys.databases d
JOIN sys.database_service_objectives s
ON d.database_id = s.database_id
WHERE d.Name = @dbName
导入.bacpac后,安装数据库的版本:
using Microsoft.SqlServer.Dac;
var services = new DacServices (connectionString);
services.ImportBacpac (BacPackage.Load (fileName), restoredDatabaseName, cancellationToken);
ALTER DATABASE [@dbName] MODIFY (EDITION = @ edition, SERVICE_OBJECTIVE = @ ServiceObjective)
或弹性池:
ALTER DATABASE [@dbName] MODIFY (SERVICE_OBJECTIVE = ELASTIC_POOL (name = [@elastic_pool_name]));
这对你有帮助吗?