GVKun编程网logo

(SqlServer)分离所有用户数据库(sqlserver分离数据库语句)

11

如果您对(SqlServer)分离所有用户数据库和sqlserver分离数据库语句感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解(SqlServer)分离所有用户数据库的各种细节,并对sqls

如果您对(SqlServer)分离所有用户数据库sqlserver分离数据库语句感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解(SqlServer)分离所有用户数据库的各种细节,并对sqlserver分离数据库语句进行深入的分析,此外还有关于C# 简单构架之 EF 进行读写分离 + 多数据库 Mysql/SqlServer、DBA基础系列SQL Server 2014:2. SQL Server用户数据库初始化配置、mssql server把数据库所有用户存储过程的EXEC权限赋另一角色、MSSQL 清理所有用户数据库日志 (SQLSERVER2008)的实用技巧。

本文目录一览:

(SqlServer)分离所有用户数据库(sqlserver分离数据库语句)

(SqlServer)分离所有用户数据库(sqlserver分离数据库语句)

 

[推荐] (sqlServer)分离所有用户数据库

——通过知识共享树立个人品牌。

在实际应用中,有时我们需要一次性分离所有用户数据库,下面给出代码,供大家参考。

 

USE  [ master ]
GO
IF  EXISTS (  SELECT  *
  FROM sys.objects
  WHERE  [ object_id ]  =  OBJECT_ID(N ' [dbo].[spDetachAllUserDatabases] ')
  AND type  IN ( N ' P ', N ' PC ' ) ) 
  DROP  PROCEDURE  [ dbo ]. [ spDetachAllUserDatabases ]
GO

CREATE  PROCEDURE  [ dbo ]. [ spDetachAllUserDatabases ]
AS 
  BEGIN
      -- Declare Variables
      DECLARE  @DatabaseName  VARCHAR( 100)
      DECLARE  @MinDatabaseID  INT
      DECLARE  @MaxDatabaseID  INT
      DECLARE  @sql  VARCHAR( 4000)
      -- Check for temporary table and drop it if it exists
      IF  OBJECT_ID( ' tempDB.dbo.#Database 'IS  NOT  NULL 
      DROP  TABLE  [ #Database ];

      -- Create temporary table
      CREATE  TABLE # Database
     (
     ID  INT  IDENTITY( 11),
     DatabaseName  VARCHAR( 100)
     )
     
      -- Check for existing user databases
      IF  EXISTS (  SELECT name
      FROM sys.databases
      WHERE database_id  >  4
      AND name  NOT  IN (  ' sqlDBA '' reportserver ',
      ' reportserverTempDB ',
      ' distribution ' ) ) 
      BEGIN 
          -- Insert all database names into a temporary table
          INSERT  INTO # Database ( DatabaseName )
          SELECT name
          FROM sys.databases
          WHERE database_id  >  4
          AND name  NOT  IN (  ' sqlDBA ',
          ' reportserverTempDB ',
          ' distribution ' ) 
         
          -- Set Variables for the detach database loop 
          SELECT  @MinDatabaseID  =  MIN(ID),
          @MaxDatabaseID  =  MAX(ID)
          FROM # Database
        
          -- Begin loop to detach databases
          WHILE  @MinDatabaseID  <=  @MaxDatabaseID
          BEGIN
         
          -- Get DatabaseName
          SELECT  @DatabaseName  = DatabaseName
          FROM # Database
          WHERE ID  =  @MinDatabaseID
         
          -- Build Detach Database Command
          SET  @sql  =  ' EXEC sp_detach_db  '  +  ''''  +  @DatabaseName
          +  ''''  +  ' ; '

          -- Try Catch block to execute sql and handle errors  
          BEGIN TRY

          -- Detach Database
          EXEC (  @sql
         )
          PRINT  ' Detached  '  +  @DatabaseName
          END TRY
          BEGIN CATCH
          SELECT  @DatabaseName,
         message_id,
         severity,
          [ text ],
          @sql
          FROM sys.messages
          WHERE message_id  =  @@ERROR
          AND language_id  =  1033  -- British English
          END CATCH

          -- Get the next DatabaseName ID
          SET  @MinDatabaseID  =  @MinDatabaseID  +  1
         
          -- End Loop
          END
      END
  END

GO

 

 

© 2011  EricHu

原创作品,转贴请注明作者和出处,留此信息。

 

------------------------------------------------

cnBlobs:http://www.cnblogs.com/huyong/
CSDNhttp://blog.csdn.net/chinahuyong 

 

作者:EricHuDBC\SB\SWebServiceWCFPM等)
出处:http://www.cnblogs.com/huyong/

Q Q80368704   E-Mail: 80368704@qq.com
本博文欢迎大家浏览和转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,在『参考』的文章中,我会表明参考的文章来源,尊重他人版权。若您发现我侵犯了您的版权,请及时与我联系。
更多文章请看 [置顶]索引贴——(不断更新中)

C# 简单构架之 EF 进行读写分离 + 多数据库 Mysql/SqlServer

C# 简单构架之 EF 进行读写分离 + 多数据库 Mysql/SqlServer


http://www.php361.com/index.php?c=index&a=view&id=3857 不建议用,太重的框架EF,仅仅参考一下别人的思路就好。

[导读]最近因为项目需要,研究了下EF的读写分离,所以做了一个demo进行测试,下面是项目的结构表现层view 主要提供Web、WebApi等表现层的解决方案公共层public 主要提供项目公共类库,数据缓存基础方法等实体层model 主要提供数据 最近因为项目需要,研究了下EF的读写分离,所以做了一个demo进行测试,下面是项目的结构 表现层view 主要提供Web、WebApi等表现层的解决方案 公共层public 主要提供项目公共类库,数据缓存基础方法等 实体层model 主要提供数据库映射模型,还有就是DDD领域操作模型 数据层Db 主要封装EF操作基础类 数据服务层Service 主要提供数据库操作服务、缓存操作服务 数据接口服务层inface 主要提供数据库操作服务接口、缓存操作服务接口 1.首先是多数据库的支持,目前就支持mysql/sqlservice,如果需要添加更多的数据库支持,只需要再数据库操作类型上面添加即可 [源码] view plain /// <summary> /// 数据库类型 /// </summary> public enum DbContextType : byte { SqlService = 1, MySql = 2 } View Code 分别对mysql/sqlservice的上下文操作进行封装 [源码] view plain /// <summary> /// MySql操作类 /// </summary> [DbConfigurationType(typeof(MySqlEFConfiguration))] public class MySqlContext : DbContext { public DbSet<Test> TestEntities { get; set; } /// <summary> /// 配置默认的字符串链接 /// </summary> public MySqlContext() : base("DefaultConnection") { } /// <summary> /// 自定义数据库链接 /// </summary> /// <param name="connenction"></param> public MySqlContext(string connenction) : base(connenction) { } /// <summary> /// 实体对应规则的映射配置 /// </summary> /// <param name="modelBuilder"></param> protected override void OnModelCreating(DbModelBuilder modelBuilder) { } } View Code [源码] view plain /// <summary> /// Sql数据库操作类 /// </summary> public class SqlServiceContext : DbContext { /// <summary> /// 配置默认的字符串链接 /// </summary> public SqlServiceContext() { } /// <summary> /// 自定义数据库链接 /// </summary> /// <param name="connenction"></param> public SqlServiceContext(string connenction) : base(connenction) { } /// <summary> /// 实体对应规则的映射配置 /// </summary> /// <param name="modelBuilder"></param> protected override void OnModelCreating(DbModelBuilder modelBuilder) { } } View Code 在view调用时候,进行ef上下文初始化只需要设置类型 [源码] view plain /// <summary> /// 数据库策略初始化类 /// </summary> public static class DBInitializer { public static DbContextType DbContextType { get; set; } /// <summary> /// 数据库初始化策略配置 /// </summary>` public static void Initialize(DbContextType ContextType) { string IsUsedWR = System.Configuration.ConfigurationManager.AppSettings["IsUsedWR"]; DbContextType = ContextType; ///获得数据库最后一个版本 // Database.SetInitializer<DBContextHelper>(new MigrateDatabaseToLatestVersion<DBContextHelper, DBConfiguration>()); if (ContextType == DbContextType.SqlService) { Database.SetInitializer(new MigrateDatabaseToLatestVersion<WriteSqlServiceContext, WriteSqlServiceDBConfiguration>()); if (IsUsedWR == "1") { Database.SetInitializer(new MigrateDatabaseToLatestVersion<ReadSqlServiceContext, ReadSqlSqlServiceDBConfiguration>()); } else { Database.SetInitializer<ReadSqlServiceContext>(null); } } else { Database.SetInitializer(new MigrateDatabaseToLatestVersion<WriteMySqlContext, WriteMySqlDBConfiguration>()); if (IsUsedWR == "1") { Database.SetInitializer(new MigrateDatabaseToLatestVersion<ReadMySqlContext, ReadMySqlDBConfiguration>()); } else { Database.SetInitializer<ReadMySqlContext>(null); } //Database.SetInitializer<WriteMySqlContext>(null); // Database.SetInitializer<ReadMySqlContext>(null); } // Database.SetInitializer<DBContextHelper>(null); ///删除原来数据库 重新创建数据库 //Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ContextHelper>()); // Database.SetInitializer<ContextHelper>(new DropCreateDatabaseIfModelChanges<ContextHelper>()); } } View Code [源码] view plain public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //Autofac //ContainerBuilder builder = new ContainerBuilder(); //builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()); //IContainer container = builder.Build(); //DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); //Autofac初始化过程 ContainerBuilder builder = new ContainerBuilder(); builder.RegisterControllers(System.Reflection.Assembly.GetExecutingAssembly());//注册mvc容器的实现 var assemblys = BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToList(); builder.RegisterAssemblyTypes(assemblys.ToArray()).Where(t => t.Name.Contains("Service")).AsImplementedInterfaces(); var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); //初始化数据库 DBInitializer.Initialize(DbContextType.MySql); } } View Code 通过上面多数据库的支持已经完成,下面进行读写分离,分别进行继承上述上下文操作 [源码] view plain /// <summary> /// /// </summary> public class WriteSqlServiceContext : SqlServiceContext { public WriteSqlServiceContext() : base("") { } } /// <summary> /// /// </summary> public class ReadSqlServiceContext : SqlServiceContext { public ReadSqlServiceContext() : base("") { } } View Code 通过工厂类进行初始化 [源码] view plain /// <summary> /// 上下文工厂类 /// </summary> public static class Contextfactory { /// <summary> /// 获取上下文 /// </summary> /// <returns></returns> public static DbContext GetContext(DbOpertionType OpertionType) { DbContextType ContextType = DBInitializer.DbContextType; if (ContextType == DbContextType.MySql) { if (OpertionType == DbOpertionType.Read) return new ReadMySqlContext(); else return new WriteMySqlContext(); } else { if (OpertionType == DbOpertionType.Read) return new ReadSqlServiceContext(); else return new WriteSqlServiceContext(); } } /// <summary> /// 获取上下文操作 /// </summary> /// <typeparam name="TEntity"></typeparam> /// <param name="OpertionType"></param> /// <returns></returns> public static TEntity CallContext<TEntity>(DbOpertionType OpertionType) where TEntity: DbContext { var DbContext = GetContext(OpertionType); return (TEntity)DbContext; } } View Code 最后配置webcofig即可 [源码] view plain <!--数据库配置(WriteMySqlConnection:读数据库,ReadMySqlConnection:写数据库 如果无需要进行 就配置IsUsedWR,2个链接都写写入库)--> <connectionStrings> <add name="WriteMySqlConnection" connectionString="data source=*; Initial Catalog=YK_Test_WriteDB ; uid=root; pwd=yk12345;Charset=utf8" providerName="MySql.Data.MySqlClient" /> <add name="ReadMySqlConnection" connectionString="data source=*; Initial Catalog=YK_Test_ReadDB ; uid=root; pwd=yk12345;Charset=utf8" providerName="MySql.Data.MySqlClient" /> </connectionStrings> <!--数据库读取分离配置--> <!--是否开启读写分离 1:开启 0:不开启--> <add key="IsUsedWR" value="1"/> View Code 最后进行测试 [源码] view plain public class TestController : Controller { private ITestService _TestServiceDb { get; set; } public TestController(ITestService TestServiceDb) { _TestServiceDb = TestServiceDb; } // GET: Test public ActionResult Index() { var result = _TestServiceDb.AddEntity(new Test() { ID=Guid.NewGuid(), Age=11, CreateTime=DateTime.Now, Name="Test" }); var NewResult = _TestServiceDb.GetEntityByID(result.ID); return View(); } } View Code 搞定,可能在代码上有点累赘,但是总算是可行的。

 

DBA基础系列SQL Server 2014:2. SQL Server用户数据库初始化配置

DBA基础系列SQL Server 2014:2. SQL Server用户数据库初始化配置

前言开始前先黑微软一把:Microsoft秉承一贯的简单易用作风(Next、Next、Next…)这点是它吸引用户的地方,但是这个优点如果用在数据库上将是一场灾难,如我们

前言

开始前先黑微软一把:microsoft秉承一贯的简单易用作风(next、next、next… )这点是它吸引用户的地方,但是这个优点如果用在数据库上将是一场灾难,如我们上一章讲到的sql server安装部署,很多人都只知道下一步下一步下一步,但是从来没有考虑过安装向导给出这么多参数配置意义何在,同样的大家习惯了安装完sql server后直接使用的方式基本上不去考虑用户数据库初始配置,随着业务量不断攀升,数据量几何倍数的递增,然后发现sql server越来越慢,但是又各种无解,最后得出一个结论sql server只能满足中小企业需要,但是真实的情况是这样吗?答案当然是否定的【传闻纳斯达克核心数据库原始数据量约2pb现已经转到sql 2014上了】视频地址

下面我将给到大家一些基本配置和思路让大家的用户数据库在未来数据量增长到TB、PB时依然可以有的放矢的去优化性能满足业务需求

当然这个仅仅是根据我的经验进行探讨,实际情况怎么搭配大家仁者见仁智者见智

无论如何还是要重申一句:本文观点仅代表个人经验,如有不足请大家补充,本文内容如果在实际生产中遇到问题不负任何责任,使用前请先自行论证,最权威的资源请查阅微软官方资料库MSDN,TechNet,官方Blog以及官方技术白皮书等

关于数据库文件场景一:新建数据库

这种情况进行优化最为轻松,优化成本最低

点击下载“修复打印机驱动工具”;

实施步骤:

1. 业务分析,回答自己几个基本问题:

业务涉及的表:

哪些表是数据活跃表:

哪些表是数据惰性表:

cur T.NAMESYS.INDEXES cur=0curcur

将上述T-SQL打印出来的语句Copy到新查询器里面批量执行即可

然后再针对遗留在原始文件组中的那些非聚集索引导出其脚本,批量指定新文件组名字然后DROP,再CREATE

最后原始文件基本上都空了,这时候进行一次数据文件收缩,也就是几秒钟的事情了,至此底层数据整理完成

P.S.其实大家可以看出重整数据文件的过程并不是想象中那么复杂,理清思路产生一大堆脚本,然后扔到Job里面慢慢执行自己就可以提前下班吃饭了

【DBA的工作内容其实还是蛮愉快的:90%以上时间都是在等,等脚本执行,等问题发生,最关键的是等老板发工资;如果一家公司DBA每天都很忙要么是DBA能力不够,要么就是公司或老板有问题】


场景二交易型项目:

交易型项目比数据仓库要复杂一些,不过基本上也是使用上述脚本修修改改就能快速完成

需要注意的地方:主键、外键、约束(尤其是自增约束等)

如果有这些特殊情况就需要有针对性的逐步分析逐步迁移了,这时候就需要先理出一个优先级列表慢慢处理

关于数据库参数

数据库参数也是比较重要的一个环节,尤其是SQL 2000退役,SQL 2005停止主流支持、SQL 2008即将停止主流支持,大量的数据库需要升级到更高版本

数据库兼容级别

在帮助客户进行性能问题分析的时候我留意了一下,很多升级上来的数据库基本上数据库兼容级别都没有修改,这个是需要注意的

SQL Server一般情况默认向下兼容3个主流版本,是为了防止由于版本升级导致用户使用的早期语法或特殊的系统视图出现错误而给予的缓冲机会,并不是说大家在已经升级到高版本后还是继续使用老版本的特性

CHECKSUM

这个参数一般是由于从SQL 2000升级上来时候没有重新配置导致,

SQL 2000的时候还只能简单的检查一下数据页头和定义,无法检查数据页是否真的正常

建议升级上来的所有数据库都去检查一下这个并设置为CHECKSUM

image

自动维护

自动关闭数据库:这个参数类似于Oracle关闭时仅发出shutdown命令,它会等待所有会话结束后关闭数据库,一般情况我们都会用到immediate要求立即结束和关闭

自动创建统计信息:这个最好是开启,SQL执行依赖的执行计划,执行计划评估执行成本就是根据统计信息来的,所以这个相当重要,不是特殊情况应该保持常开

自动收缩数据库:个人从来就很诧异这个参数,如此耗费性能又没有实际价值的一个参数有存在的意义吗?如果不是特殊原因这个参数应该始终关闭

自动更新统计信息:这个参数同自动创建统计信息是一样的,强烈建议常开,统计信息收集越准SQL执行选择的执行计划就会越优,,性能也就越好

自动异步更新统计信息:这个参数建议设置为开启,我们知道统计信息非常重要,但是如果每次数据变化都去收集一次统计信息这个性能也就不那么好了,这个又再次体现了【平衡】

image

更多优化内容(下一章详解):

以上内容各个版本数据库都适用,下列内容将针对特殊版本使用

数据压缩:

适用版本:SQL Server 2008及其以后

非聚集列存储索引:

适用版本:SQL Server 2012及其以后

聚集列存储索引:

适用版本:SQL Server 2014及其以后

本文出自 “Fast” 博客,请务必保留此出处

mssql server把数据库所有用户存储过程的EXEC权限赋另一角色

mssql server把数据库所有用户存储过程的EXEC权限赋另一角色

mssql server把所有用户存储过程的exec权限赋另一角色

$sql="create   procedure   sp_GrantProce(@username   varchar(40)) as begin         declare   @user   varchar(20),@name   varchar(40)         declare   t_cursor   cursor   for         select   user_name(uid)   as   users,name   from   sysobjects   where   (xtype= ''P ''   or   xtype= ''X '')   and   status> 0                 open   t_cursor                 fetch   next   from   t_cursor   into   @user,@name                 while   @@fetch_status=0         begin                 exec( ''grant   execute   on   + ''. + ''   to   )                 fetch   next   from   t_cursor   into   @user,@name         end                 close   t_cursor         deallocate   t_cursor end go";

MSSQL 清理所有用户数据库日志 (SQLSERVER2008)

MSSQL 清理所有用户数据库日志 (SQLSERVER2008)

USE [master];
SET NOCOUNT ON;

DECLARE @tbName VARCHAR(50)='''';
DECLARE @tbLog VARCHAR(100)='''';
DECLARE @clearSql VARCHAR(MAX)='''';

DECLARE @TMP_WHILE_ID INT=0;
SELECT TMP_WHILE_ID=IDENTITY(INT,1,1),TMP_WHILE_FLAG=0,
T.tbName,T.tbLog
INTO #TMP_WHILE
FROM
(
SELECT master.sys.databases.name AS tbName, master.sys.master_files.name AS tbLog
FROM master.sys.master_files INNER JOIN master.sys.databases ON master.sys.master_files.database_id = master.sys.databases.database_id
WHERE (master.sys.databases.owner_sid <> 0x01) AND (master.sys.master_files.type = 1)
) AS T

SELECT @TMP_WHILE_ID=MIN(TMP_WHILE_ID) FROM #TMP_WHILE WHERE TMP_WHILE_FLAG=0;
WHILE @TMP_WHILE_ID IS NOT NULL
BEGIN
    SELECT @tbName=tbName,@tbLog=tbLog FROM #TMP_WHILE WHERE TMP_WHILE_ID=@TMP_WHILE_ID;
    
    SET @clearSql=@clearSql+''USE [master];''+CHAR(10);
    SET @clearSql=@clearSql+''ALTER DATABASE [''+@tbName+''] SET RECOVERY SIMPLE WITH NO_WAIT;''+CHAR(10);
    SET @clearSql=@clearSql+''ALTER DATABASE [''+@tbName+''] SET RECOVERY SIMPLE;''+CHAR(10);
    SET @clearSql=@clearSql+''USE [''+@tbName+''];''+CHAR(10);
    SET @clearSql=@clearSql+''DBCC SHRINKFILE (''''''+@tbLog+'''''',1,TRUNCATEONLY);''+CHAR(10);
    SET @clearSql=@clearSql+''USE [master];''+CHAR(10);
    SET @clearSql=@clearSql+''ALTER DATABASE [''+@tbName+''] SET RECOVERY FULL WITH NO_WAIT;''+CHAR(10);
    SET @clearSql=@clearSql+''ALTER DATABASE [''+@tbName+''] SET RECOVERY FULL;''+CHAR(10);
    
    UPDATE #TMP_WHILE SET TMP_WHILE_FLAG=1 WHERE TMP_WHILE_ID=@TMP_WHILE_ID;
    SELECT @TMP_WHILE_ID=MIN(TMP_WHILE_ID) FROM #TMP_WHILE WHERE TMP_WHILE_FLAG=0 AND TMP_WHILE_ID>@TMP_WHILE_ID;
END

DROP TABLE #TMP_WHILE;
--PRINT @clearSql;
EXEC(@clearSql);

 

今天的关于(SqlServer)分离所有用户数据库sqlserver分离数据库语句的分享已经结束,谢谢您的关注,如果想了解更多关于C# 简单构架之 EF 进行读写分离 + 多数据库 Mysql/SqlServer、DBA基础系列SQL Server 2014:2. SQL Server用户数据库初始化配置、mssql server把数据库所有用户存储过程的EXEC权限赋另一角色、MSSQL 清理所有用户数据库日志 (SQLSERVER2008)的相关知识,请在本站进行查询。

本文标签: