• [技术干货] RDS SQL SERVER 上主账号rdsuser的权限边界,以及他创建的子账号授权范围(新增2008R2)
    适用场景:通过诠释rdsuser账号的权限边界,让用户能够更好的使用和理解华为云RDS SQL SERVER。同时给出了全套的授权脚本,用户可以通过使用该脚本在rdsuser下创建子账号并进行有效管理。 rdsuser权限如下:实例级权限:实例级角色权限:[processadmin][setupadmin]实例级对象权限:ALTER ANY CONNECTIONALTER ANY LOGINALTER ANY SERVER ROLEALTER SERVER STATEALTER TRACECONNECT ANY DATABASECONTROL SERVERCONNECT SQLCREATE ANY DATABASESELECT ALL USER SECURABLESVIEW ANY DEFINITIONVIEW ANY DATABASEVIEW SERVER STATE数据库权限:master:publicMsdb:PublicSQLAentUserRoleModel:PublicRdsadmin:PublicOtherDB:Db_Owner rdsuser子账号创建+授权脚本:为了帮助大家快速的通过rdsuser创建子账号,并授予对应的最大操作权限,特此给出授权脚本。备注:本脚本只适用于SQL SERVER 2014 及以上版本,2008R2在下面use [master] DECLARE @DBName NVARCHAR(128)DECLARE @SQL NVARCHAR(max)DECLARE @Login_Name nvarchar(128)DECLARE @Login_Password nvarchar(128) set @Login_Name = 'TestLogin3'        --change your login nameset @Login_Password = '1qaz!QAZ'         SET @SQL='            USE [master] CREATE LOGIN  '+@Login_name+' WITH PASSWORD=N'''+ @Login_Password +''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF                       alter server role [processadmin] add member  '+@Login_name+'            alter server role [setupadmin] add member '+@Login_name+'            GRANT VIEW SERVER STATE TO '+@Login_name+' WITH GRANT OPTION            GRANT VIEW ANY DEFINITION TO '+@Login_name+' WITH GRANT OPTION            GRANT VIEW ANY DATABASE TO '+@Login_name+' WITH GRANT OPTION            GRANT CREATE ANY DATABASE TO '+@Login_name+' WITH GRANT OPTION            GRANT ALTER SERVER STATE TO '+@Login_name+' WITH GRANT OPTION            GRANT ALTER TRACE TO '+@Login_name+' WITH GRANT OPTION            GRANT ALTER ANY SERVER ROLE TO '+@Login_name+' WITH GRANT OPTION            GRANT ALTER ANY LOGIN TO '+@Login_name+' WITH GRANT OPTION            GRANT ALTER ANY CONNECTION TO '+@Login_name+' WITH GRANT OPTION            GRANT CONNECT SQL TO '+@Login_name+' WITH GRANT OPTION            GRANT VIEW SERVER STATE TO '+@Login_name+' WITH GRANT OPTION        'print @SQL        exec (@SQL)         SET @SQL='            use [msdb]            if exists(select top 1 1 from sys.sysusers where name = '''+ @Login_Name +''')            begin                ALTER USER '+@Login_name+' with login = '+@Login_name+';            end            else            begin                CREATE USER '+@Login_name+' FOR LOGIN '+@Login_name+';            end            ALTER ROLE [SQLAgentUserRole] ADD MEMBER '+@Login_name+'            GRANT ALTER ON ROLE::[SQLAgentUserRole] TO '+@Login_name+' WITH GRANT OPTION            GRANT ALTER ANY USER TO  '+@Login_name+'  WITH GRANT OPTION            GRANT EXEC ON msdb.dbo.sp_delete_database_backuphistory TO   '+@Login_name+'    WITH GRANT OPTION            GRANT EXEC ON msdb.dbo.sp_purge_jobhistory TO   '+@Login_name+'    WITH GRANT OPTION             GRANT SELECT ON msdb.dbo.sysjobs TO '+@Login_name+'  WITH GRANT OPTION;            GRANT SELECT ON msdb.dbo.sysschedules TO '+@Login_name+'  WITH GRANT OPTION;            GRANT SELECT ON msdb.dbo.sysjobsteps TO '+@Login_name+'  WITH GRANT OPTION;            GRANT SELECT ON msdb.dbo.sysjobhistory TO '+@Login_name+'  WITH GRANT OPTION;            GRANT SELECT ON msdb.dbo.syscategories TO '+@Login_name+'  WITH GRANT OPTION;            GRANT SELECT ON msdb.dbo.sysjobschedules TO '+@Login_name+'  WITH GRANT OPTION;        'print @SQL        exec (@SQL)         declare DBName_Cursor cursor  for        select quotename(name) from sys.databases where database_id > 4 and state = 0        and name not like '%$%'        and name <> 'rdsadmin'        open DBName_Cursor            fetch next from DBName_Cursor into @DBName            WHILE @@FETCH_STATUS = 0            begin                SET @SQL='        USE ' + (@DBName) + '                            if exists(select top 1 1 from sys.sysusers where name = '''+ @Login_Name +''')                            begin                                ALTER USER '+@Login_name+' with login = '+@Login_name+';                                ALTER ROLE [db_owner] ADD MEMBER '+@Login_name+';                            end                            else                            begin                                CREATE USER '+@Login_name+' FOR LOGIN '+@Login_name+';                                ALTER ROLE [db_owner] ADD MEMBER '+@Login_name+';                            end                            'print @SQL                EXEC (@SQL)                fetch next from DBName_Cursor into @DBName            end        close DBName_Cursor        deallocate DBName_Cursor    备注:本脚本只适用于SQL SERVER 2008R2 版本,2014以上版本看上面滴        use [master]        DECLARE @DBName NVARCHAR(128)        DECLARE @SQL NVARCHAR(max)        DECLARE @Login_Name nvarchar(128)        DECLARE @Login_Password nvarchar(128)        set @Login_Name = 'TestLogin7'        --change your login name        set @Login_Password = '1qaz!QAZ'        SET @SQL='        USE [master]        CREATE LOGIN  '+@Login_name+' WITH PASSWORD=N'''+ @Login_Password +''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF        EXEC sp_addsrvrolemember '+ @Login_name +' , [processadmin]        EXEC sp_addsrvrolemember '+ @Login_name +' , [setupadmin]             GRANT VIEW SERVER STATE TO '+@Login_name+' WITH GRANT OPTION        GRANT VIEW ANY DEFINITION TO '+@Login_name+' WITH GRANT OPTION        GRANT VIEW ANY DATABASE TO '+@Login_name+' WITH GRANT OPTION        GRANT CREATE ANY DATABASE TO '+@Login_name+' WITH GRANT OPTION        GRANT ALTER SERVER STATE TO '+@Login_name+' WITH GRANT OPTION        GRANT ALTER TRACE TO '+@Login_name+' WITH GRANT OPTION        GRANT ALTER ANY LOGIN TO '+@Login_name+' WITH GRANT OPTION        GRANT ALTER ANY CONNECTION TO '+@Login_name+' WITH GRANT OPTION        GRANT CONNECT SQL TO '+@Login_name+' WITH GRANT OPTION        GRANT VIEW SERVER STATE TO '+@Login_name+' WITH GRANT OPTION        '        print @SQL        exec (@SQL)        SET @SQL='            use [msdb]            if exists(select top 1 1 from sys.sysusers where name = '''+ @Login_Name +''')            begin                ALTER USER '+@Login_name+' with login = '+@Login_name+';            end            else            begin                CREATE USER '+@Login_name+' FOR LOGIN '+@Login_name+';            end            EXEC sp_addrolemember [SQLAgentUserRole], '+@Login_name+'                               GRANT ALTER ON ROLE::[SQLAgentUserRole] TO '+@Login_name+' WITH GRANT OPTION            GRANT ALTER ANY USER TO  '+@Login_name+'  WITH GRANT OPTION            GRANT EXEC ON msdb.dbo.sp_delete_database_backuphistory TO   '+@Login_name+'    WITH GRANT OPTION            GRANT EXEC ON msdb.dbo.sp_purge_jobhistory TO   '+@Login_name+'    WITH GRANT OPTION            GRANT SELECT ON msdb.dbo.sysjobs TO '+@Login_name+'  WITH GRANT OPTION;            GRANT SELECT ON msdb.dbo.sysschedules TO '+@Login_name+'  WITH GRANT OPTION;            GRANT SELECT ON msdb.dbo.sysjobsteps TO '+@Login_name+'  WITH GRANT OPTION;            GRANT SELECT ON msdb.dbo.sysjobhistory TO '+@Login_name+'  WITH GRANT OPTION;            GRANT SELECT ON msdb.dbo.syscategories TO '+@Login_name+'  WITH GRANT OPTION;            GRANT SELECT ON msdb.dbo.sysjobschedules TO '+@Login_name+'  WITH GRANT OPTION;        '        print @SQL        exec (@SQL)                declare DBName_Cursor cursor  for        select quotename(name)from sys.databases where   database_id > 4 and state = 0        and name not like '%$%'        and name <> 'rdsadmin'        open DBName_Cursor        fetch next from DBName_Cursor into @DBName        WHILE @@FETCH_STATUS= 0        begin            SET @SQL='        USE '+ (@DBName)+ '                        if exists(select top 1 1 from sys.sysusers where name = '''+ @Login_Name +''')                        begin                            ALTER USER '+@Login_name+' with login = '+@Login_name+';                                EXEC sp_addrolemember N''db_owner'', N'''+@Login_name+''';                                                                end                        else                        begin                            CREATE USER '+@Login_name+' FOR LOGIN '+@Login_name+';                            EXEC sp_addrolemember N''db_owner'', N'''+@Login_name+''';                        end                        '        print @SQL            EXEC (@SQL)            fetch next from DBName_Cursor into @DBName        end        close DBName_Cursor        deallocate DBName_Cursor        
  • [技术干货] 华为云推出客户端数据管理服务,可视化操作大幅提高工作效率
    俗话说:人强不如家伙强,多做不如精做好;工欲善其事,必先利其器。云技术的发展和云市场的成熟,让各行各业上云势头如日中天。应用上云、业务上云,最终都离不开数据上云。那么,如何方便快捷的对云上数据进行管理呢?近期,华为云推出一款客户端数据管理服务,帮助用户实现数据可视化直接管理,大幅提高工作效率。 华为云数据管理服务(Data Admin Service),简称 DAS,是一款专业的简化数据库管理工具,提供业界领先的可视化操作界面,直接对数据结构进行查询、变更操作,旨在让数据管理变得安全和简单。                                  华为云数据管理服务 DAS 众所周知,在云上创建数据库后,云上管理关系型数据库(RDS)数据结构,经常会面临需要安装客户端,才可以访问 RDS 的问题。不但安装麻烦,而且使用不便,给用户带来不少困扰。 DAS 通过可视化界面连接和管理数据库,在云端专用通道管理数据,并且借助华为云的高安全机制,严格控制数据库访问。在云上管理数据库的同时,实现了云研发测试、快速部署和访问数据库,大大提升研发效率。                *DAS 系统架构图(目前支持引擎: MySQL、SQL Server) 三大场景,助推企业用好数据库 数据访问DAS 提供了类似 Excel 的表格方式编辑数据,让不懂 SQL 查询语言的用户也能无障碍增删、改查表数据以及统计分析。此外用户还可以保存常用的 SQL,随时引用执行,使得工作效率更高效。 结构管理 DAS 简化数据库结构设计,支持可视化的目录结构管理。例如导航树形结构,可清晰展示和管理各个对象,让数据管理更方便。此外,DAS 能在可视化页面实现 DDL 数据库模式定义,从而轻松完成数据结构变更。 3. 数据导入导出DAS 提供了 Excel 或者 INSERT (用于向表格中**新的行)语句类型的快速导出和导入数据功能,提供 SQL 模板,或自定义 SQL 窗口输入并执行计划,并根据输入的 SQL 语句导出记录,支持文档型、字符集数据导入。 值得一提的是,DAS 采用华为云专用的云端通道,严格控制访问,保障用户数据安全。在安全方面,华为云提供 VPC、子网、安全组、VPN、SSL 在内的一系列网络隔离与权限控制策略,搭配业界领先的DBSS数据库安全防护技术,多种行业安全合规、清晰的安全责任界定,安全架构可谓层层加固。 近期,DAS 上线了支持用户权限管理,用户连接、主机连接、数据库资源访问管理,事务管理,表结构DDL导出下载、表属性查看,表结构 DDL 对比等新功能。不但可在 Web 页面直接勾选,进行权限授权,而且可以对测试环境和生产环境进行差异比较,进一步满足用户的数据管理需求。 目前,DAS 已集成到华为云的管理控制台,用户创建 RDS 完成即可连接访问,实现可视化数据库管理操作。申请免费体验,请移步官网:https://www.huaweicloud.com/product/das.html 配套数据库引擎免费试用请点击:https://activity.huaweicloud.com/free_test/index.html 福利时间:华为云产品活动月,数据库产品全场 3.5 折起,安全产品全场低至 1 折;不限新老用户,下单即享折扣! 2018 华为全联接大会将于10月份在上海召开,届时将首发华为AI战略和全栈全场景的解决方案,并携合作伙伴带来更多诸如“秦渲云”这样AI、云、大数据、5G、IoT、视频等在各行业的创新与实践,惠及更多开发者人群,“+智能,见未来”我们拭目以待。
  • [技术干货] RDS SQL SERVER通过Generate Script(生成脚本)功能对数据库进行逻辑迁移
    适用场景:1.用户在本地的实例或者在ECS上的实例2.数据库整体大小不是很大(最好不超过300M)3.适用于华为云合营云场景,在没有部署DRS,甚至没有公网IP的情况下可选择本方案 操作步骤:1.在你本地或ECS上,通过SSMS连接你的实例2.通过SQL SERVER自带的脚本生成工具,将数据库结构脚本和每个对象的静态数据库通过SQL脚本生成出来,步骤如下:a.选中要生成schema脚本的数据库,点击鼠标右键选择任务-->生成脚本    b.在导航页中根据提示选择下一步,并确认要导出的对象,可选全部,也可以选择独立对象模块导出    c.下一步,选择将要导出的文件保存到对应的位置i.当你的数据库整体大小<=50M时,可以选择单个文件ii.当你的数据库大小>50M时,可以选择每个对象一个文件    d.同时点击高级按钮进入详细选项页面,根据实际需要选择具体脚本生成规则和相关细节,例如:触发器,索引,唯一键,主键,服务器版本等重要选项。特别注意:要编写脚本的数据库的类型选择为架构和数据    e.最后点击下一步完成脚本生成5.将生成的每一个SQL脚本文件在SSMS上打开,远程连接到RDS对应实例上,逐个进行执行就可以将数据库结构和数据在远端重新生成。 备注:该方案在某些表中数据库特别大的时候,可能无法直接在SSMS管理工具中直接打开执行,需要通过SQLCMD命令远程连接到实例端直接进行执行。例如:sqlcmd -s 127.0.0.1 -i g:\1.sql -U rdsuser -P 123456官方地址:https://docs.microsoft.com/zh-cn/sql/relational-databases/scripting/sqlcmd-start-the-utility?view=sql-server-2017
  • [技术干货] RDS SQL SERVER 支持DMV动态管理视图,方便用户快速查询实例上性能消耗最高的10条SQL语句
    适用场景:1.用户实例出现性能瓶颈,感觉自己的数据库执行效率越来越低2.或通过监控发现在某些时段CPU,IO较高 操作步骤:1.首先在客户端通过rdsuser账号连接到你的实例,在管理面中执行以下语句 declare @DatabaseName nvarchar(100)set @DatabaseName = 'Wisdom_TT_ODS' select top 100DB_NAME(st.dbid) as DBName, OBJECT_NAME(st.objectid,st.dbid) as ObjectName,substring(st.text,(qs.statement_start_offset/2)+1,((case qs.statement_end_offset when -1 then datalength(st.text) else qs.statement_end_offset end - qs.statement_start_offset)/2) + 1) as Statement,st.text as Query,qp.query_plan,plan_generation_num,creation_time,last_execution_time,execution_count,total_worker_time,min_worker_time  ,max_worker_time,total_logical_reads,min_logical_reads,max_logical_reads,total_elapsed_time,min_elapsed_time,max_elapsed_time,total_rows,min_rows,max_rows,total_worker_time/execution_count as avg_worker_time                                --平均CPU耗时,total_logical_reads/execution_count as avg_logical_reads                        --平均逻辑读,total_elapsed_time/execution_count as avg_elapsed_time                                --平均总耗时,total_rows/execution_count as avg_rows                                                        --平均处理数据行,sql_handle                ,plan_handle,query_hash,query_plan_hashfrom sys.dm_exec_query_stats qscross apply sys.dm_exec_sql_text(plan_handle) stcross apply sys.dm_exec_query_plan(plan_handle) qpwhere st.dbid=DB_ID(@DatabaseName)and text not like '%sys.%'and text not like '%[[]sys]%'order by avg_worker_time desc 2.我们可以看到查询结果中相应数据库中的SQL执行记录以及对应的资源消耗详情。字段说明详见:http://technet.microsoft.com/zh-tw/library/ms189741.aspx 3.其中最常用的是total_worker_time 和 total_elapsed_time,这两个参数一个是CPU累计消耗时间,一个是SQL执行累计消耗时间,通过倒序排序,从而获得该数据库或整个实例上面消耗最高的前10 SQL语句 4.后面就需要用户自己通过Statement中的SQL语句,结合自身应用业务场景进行优化了。注:query_plan里面的执行计划有很好的参考价值 如果你实在无法优化也没关系,可以花钱购买华为RDS DBA服务,我们来帮你优化。
  • 数据库分库分表基础和实践
    数据库架构的演变在业务数据量比较少的时代,我们使用单机数据库就能满足业务使用,随着业务请求量越来越多,数据库中的数据量快速增加,这时单机数据库已经不能满足业务的性能要求,数据库主从复制架构随之应运而生。主从复制是将数据库写操作和读操作进行分离,使用多个只读实例(slaver replication)负责处理读请求,主实例(master)负责处理写请求,只读实例通过复制主实例的数据来保持与主实例的数据一致性。由于只读实例可以水平扩展,所以更多的读请求不成问题,随着云计算、大数据时代的到来,事情并没有完美的得以解决,当写请求越来越多,主实例的写请求变成主要的性能瓶颈。如何解决上述问题?如果仅仅通过增加一个主实例来分担写请求,写操作如何在两个主实例之间同步来保证数据一致性,如何避免双写,问题会变的更加复杂。这时就需要用到分库分表(sharding),对写操作进行切分来解决,如图1。华为云中间件产品DDM(Distributed Database Middleware)作为RDS的前置分布式数据库访问服务,彻底解决了数据库的扩展性问题,对应用透明地实现海量数据的高并发访问,实现了读写分离和分库分表。                    图1:典型的读写分离和分库分表 数据分片的实现方案数据分片的实现方案可分为应用层分片和中间件分片,这两种实现方案的特点如图2所示:DDM作为一款优秀的分布式数据库中间件产品,实现了读写分离和数据分片功能,使用DDM来分库分表,应用0改动,对应用完全透明。                      图2:应用层分片和中间件分片分库分表的切分方式数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切分方式可以称之为数据的垂直(纵向)切分;另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。 垂直切分最大特点就是规则简单,实施也更为方便,尤其适合各业务之间的耦合度非常低,相互影响很小,业务逻辑非常清晰的系统。在这种系统中,可以很容易做到将不同业务模块所使用的表分拆到不同的数据库中。根据不同的表来进行拆分,对应用程序的影响也更小,拆分规则也会比较简单清晰。 水平切分于垂直切分相比,相对来说稍微复杂一些。因为要将同一个表中的不同数据拆分到不同的数据库中,对于应用程序来说,拆分规则本身比根据表名来拆分更为复杂,后期的数据维护也会更为复杂一些。具体而言,如果单个库太大,这时我们要看是因为表多而导致数据多,还是因为单张表里面的数据多。如果是因为表多而数据多,使用垂直切分,根据业务切分成不同的库。如果是因为单张表的数据量太大,这时要用水平切分,即把表的数据按某种规则切分成多张表,甚至多个库上的多张表。分库分表的顺序应该是先垂直分,后水平分。因为垂直分更简单,更符合我们处理现实世界问题的方式。水平切分相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中,如图3:                          图3:水平切分水平切分的优点:1、拆分规则抽象好,join操作基本可以数据库做。 2、不存在单库大数据,高并发的性能瓶颈。 3、应用端改造较少。 4、  提高了系统的稳定性跟负载能力。水平切分的缺点:1、拆分规则难以抽象。 2、分片事务一致性难以解决。 3、数据多次扩展难度跟维护量极大。 4、跨库join性能较差。 水平切分的典型分片规则:1、HASH取模例如:取用户id,然后hash取模,分配到不同的数据库上。2、RANGE例如:从0到10000一个表,10001到20000一个表。3、时间按照时间切分,例如:将6个月前,甚至一年前的数据切出去放到另外的一张表,因为随着时间流逝,这些表的数据被查询的概率变小,所以没必要和”热数据“放在一起,这个也是“冷热数据分离”。切分原则一般是根据业务找到适合的切分规则分散到不同的库,如图4,根据用户ID取模作为切分规则。                       图4:根据userid取模进行切分垂直切分一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同的数据库上面,这样也就将数据或者说压力分担到不同的库上面,如图5:                             图5:垂直切分垂直切分的优点:1、数据维护简单。 2、拆分后业务清晰,拆分规则明确。 3、系统之间整合或扩展容易。 垂直切分的缺点:1、事务处理复杂。 2、部分业务表无法join,只能通过接口方式解决,提高了系统复杂度。 3、受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高。 由于垂直切分是按照业务的分类将表分散到不同的库,所以有些业务表会过于庞大,存在单库读写与存储瓶颈,所以就需要水平拆分来做解决。切分原则由于数据切分后数据Join的难度,在此也分享一下数据切分的经验: 第一原则:能不切分尽量不要切分。 第二原则:如果要切分一定要选择合适的切分规则,提前规划好。 第三原则:数据切分尽量通过数据冗余或表分组(Table Group)来降低跨库Join的可能。 第四原则:由于数据库中间件对数据Join实现的优劣难以把握,而且实现高性能难度极大,业务读取尽量少使用多表Join。分库分表后的问题和应对策略分库分表主要用于应对当前互联网常见的两个场景:海量数据和高并发。然而,分库分表是一把双刃剑,虽然很好的应对海量数据和高并发对数据库的冲击和压力,但也提高了系统的复杂度和维护成本,带来一些问题。1、事务支持在分库分表后,就成为分布式事务了,如何保证数据的一致性成为一个必须面对的问题。一般情况下,使存储数据尽可能达到用户一致,保证系统经过一段较短的时间的自我恢复和修正,数据最终达到一致。 2、分页与排序问题一般情况下,列表分页时需要按照指定字段进行排序。在单库单表的情况下,分页和排序也是非常容易的。但是,随着分库与分表的演变,也会遇到跨库排序和跨表排序问题。为了最终结果的准确性,需要在不同的分表中将数据进行排序并返回,并将不同分表返回的结果集进行汇总和再次排序,最后再返回给用户。 3、表关联问题在单库单表的情况下,联合查询是非常容易的。但是,随着分库与分表的演变,联合查询就遇到跨库关联的问题。粗略的解决方法:ER分片:子表的记录与所关联的父表记录存放在同一个数据分片上。全局表:基础数据,所有库都拷贝一份。字段冗余:这样有些字段就不用join去查询了。ShareJoin:是一个简单的跨分片join,目前支持2个表的join,原理就是解析SQL语句,拆分成单表的SQL语句执行,然后把各个节点的数据汇集。 4、分布式全局唯一ID在单库单表的情况下,直接使用数据库自增特性来生成主键ID,这样确实比较简单。在分库分表的环境中,数据分布在不同的分表上,不能再借助数据库自增长特性,需要使用全局唯一ID。分库分表案例某税务核心征管系统,全国34个省国/地税,电子税务局15省格局。技术路径:核心征管 + 纳税服务 业务应用分布式上云改造。业务挑战1、数据查询时间3-5秒,响应速度慢严重影响体验当前业务逻辑大量放在数据库层,一个办税业务的事务边界过大(40条SQL语句),涉及以“申报”、“发票”大表为主的多张表关联事务操作,导致业务查询响应速度慢。2、亿级数据快速的增长,挑战业务性能瓶颈省级税务局,办税高峰期承载百万级用户并发量,3000-5000TPS。现网分析得到数据:核心征管库近1000张表,其中“申报”、“发票”业务表数据量大、增长快,是主要瓶颈表;发票综合信息:每省10亿级条记录,每年千万到亿条记录级别增量;申报信息表:亿级记录数据量。解决方案1、垂直分库、微服务分解数据库压力,降低单业务sql数基于微服务将大事务拆解为异步小事务,业务逻辑从数据库层面剥离。拆分主库数据,将大表垂直拆分到多个数据库中,一个业务40条SQL缩减到20条SQL,达到分解数据库压力的目的。2、数据分片支撑海量数据增长,线性提升业务处理速度单表亿级记录以纳税人作为拆分键,拆分到RDS-MySQL 的128个分片上。实现支撑海量数据的存储。拆分后数据库设计简洁、简单,数据库的表之间不设外键,不写触发器,不写存储过程,实现数据库记录的水平扩展。3、读写分离提升查询性能DDM自动实现读写分离,透明地完成写操作和读操作的分发,应用程序无需做特殊的改动和处理逻辑。写操作分发到RDS主实例,读操作自动分发到RDS的多个读实例上,这样写操作不会影响读操作的并发,读并发业务增长时只需要按需增加只读实例即可。 企业受益1、使用了DDM之后,轻松突破原来的性能瓶颈,一次业务操作,原来需要3到5秒,现在只需要1秒。2、读写操作通过DDM的自动读写分离,在不改动业务情况下,轻松提升了整体的读写并发能力。  参考文献:[1]. Mycat权威指南欢迎扫码查看更多精彩:
  • 通过ECS虚拟机+RDS SQL Server10分钟搭建一套爬虫环境,迎娶白富美走上人生巅峰不是梦
    基于RDS For SQL Server爬虫实践云数据库(SQL Server)+云数据库客户端(DAS)背景本教程爬取的是新浪微博微公益平台的微拍卖拍品信息列表。爬虫爬取的信息为拍品序号、拍品名称、起拍价和当前价。我们需要在数据库中构建一个存储这4个信息的表格,随后用爬虫爬取数据将数据存入数据库中。字段名字段说明举例Id序号1project_name拍品名称春节晚会小虎队演出服-霹雳虎project_start_price起拍价100Project_now_price当前价57680 下面,让我们开始搭建小爬虫吧!1.下载软件1.1 下载pycharm community版>下载路径:https://www.jetbrains.com/pycharm/download/#section=windows 选择community版1.2下载python2.7.15>下载路径:https://www.python.org/downloads/release/python-2715/,选择Windows x86-64 MSI installer2.安装2.1 安装python-2.7.15>运行python-2.7.15.amd64.msi>Install for all users>选择目标路径,点击Next>点击Next>点击Finish2.2 安装PyCharm>运行pycharm-community-2018.2.1.exe>点击Next>选择默认路径即可,也可以自定义路径,点击Next。>根据系统操作系统版本选择, 64位系统选择64-bit launcher, 其他勾选如上图。>点击Install>勾选Run Pycharm Community **,点击Finish>运行PyCharm>阅读完政策说明后点击Accept>点击create new project>设置Project的存储路径>点击create>点击close2.3在pycharm中安装第三方库>点击file>点击settings>点击project untitled1(其中untitled1为自定义的项目名)>点击 project interpreter>点击右侧的“+”号>在搜索框中输入pymssql,选中pymssql, 点击Install Package出现以下提示说明安装成功,关闭PyCharm 3.购买云数据库在华为云官网开发者支持计划领取免费套餐,或者购买SQL Server数据库4.申请数据库客户端DAS>目前DAS在公测阶段,您可以通过以下链接申请免费试用https://www.huaweicloud.com/product/das.html5.登录华为云数据库管理页面>DAS服务申请成功后登陆管理控制台,选择您要存储数据的实例,点击登陆,跳转到DAS登陆页面输入管理员账户名和密码,账户名可在实例信息页面查到,一般默认为rdsuser,密码为您在购买数据库实例时输入的管理员密码。 >登陆DAS后右键点击实例名>点击SQL窗口,将以下SQL语句输入编辑框中,点击执行SQL语句,执行成功后sina数据库就建好啦。CREATE DATABASE [sina]CONTAINMENT = NONEON PRIMARY ( NAME = N'sina', FILENAME = N'D:\RDSDBDATA\DATA\sina.mdf' , SIZE = 5120KB , FILEGROWTH = 1024KB )LOG ON ( NAME = N'sina_log', FILENAME = N'D:\RDSDBDATA\DATA\sina_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)随后删除上述SQL语句,并在在SQL语句输入框中输入以下SQL语句,建立sina_paimai表USE [sina];CREATE TABLE [sina].[dbo].[sina_paimai]([id] int NOT NULL IDENTITY (1,1) ,[project_name] nvarchar(max) NULL ,[project_start_price] nvarchar(max) NULL ,[project_now_price] nvarchar(max) NULL );ALTER TABLE [dbo].[sina_paimai] ADD CONSTRAINT[PK_sina_paimai] PRIMARY KEY CLUSTERED ([id]) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];ALTER TABLE [dbo].[sina_paimai] SET (LOCK_ESCALATION = TABLE);完成上述步骤后我们已经在sina中新建了一张名为sina_paimai的表,表**有四个字段,分别是id,project_name,project_start_price,project_now_price 6.完成以上步骤后,只差最后一步,爬虫就搭建完成啦。>打开pycharm>右键点击project untitled1>点击new>点击python file 给你要创建的python程序起一个名字,点击OK.然后把以下“sina爬虫.txt”代码复制进你刚刚创建的python文件中,并把以下这段代码中的前四个字段依次改成你的数据库实例公网IP:端口号,数据库账户名,密码和数据库名保存就可以啦~connection=pymssql.connect(    'xxx.xxx.x.xxx:xxxx',    'rdsuser',    'xxxxxxxx',    'sina',    charset='utf8',   )爬虫代码:见下方附件 最后点击run!7.在数据库客户端DAS中查看爬取的数据>登录DAS, 在SQL窗口中输入SELECT * FROM `sina_paimai`,点击执行SQL就可以看到爬取的结果啦
  • [技术干货] 微软官方学习库Adventure示例数据库安装方法,最后附赠微软SQL SERVER入门Step by Step
    适用场景:微软Adventure示例数据库是微软提供的官方学习数据库,里面提供OLTP和OLAP的真实数据库场景,极大的便利了新人学习数据库的使用和入门,并且该数据库紧密的结合了微软的官方文档和三方学习资料,是用户入门SQL SERVER 的不二选择。 下载地址:请下载一个SQL SERVER 2014 以上版本的AdventureWorks数据库https://github.com/Microsoft/sql-server-samples/releases/tag/adventureworks 准备阶段:在一切开始之前,你需要到华为官网注册一个账号,并申请一个RDS SQL SERVER 2014 Web 或 RDS SQL SERVER 2016 Web版实例 安装步骤:1.点击上面链接进入微软官网下载最新Adventure实例数据库,进入页面后点击要下载的bak文件(推荐AdventureWorks2014.bak)。备注:AdventureWorks是OLTP场景的业务数据库;AdventureWorksDW是OLAP的的分析型数据库;大家根据需要选择下载,考虑到大小关系,本次就仅下载AdventureWorks2014.bak,给大家进行演示。sql-server-2016-samples.zip:是微软2016新特性的用例脚本,方便大家对2016新特性进行学习用的。2.将AdventureWorks2014.bak备份文件保存到本地后,我们账号登录华为云官网,进入对象存储服务 3.我们在上面先创建一个公共桶obs-qian。注意:1.该桶所在区域必须跟RDS SQL SERVER 实例所在区域一致  2.该桶最好设置为公共读写   4.桶建好之后,可以直接通过在线页面能进行上传点击刚才生成的桶,在对象里面可以上传文件到根目录。注意:1.小于50M的文件支持页面上传2.目前DRS服务仅支持根目录上的备份文件上传,所以请直接上传文件,不要添加文件夹3.注意上传时不要点击KMS加密功能 5.如果你的备份文件大于50M,则需要下载OBS客户端进行上传操作。a.工具下载地址:https://developer.huaweicloud.com/toolsb.选择业务工具,下载OBS Browser工具 到本地,下载完成后可直接解压使用c.解压后双机obs.exe打开客户端通过AKSK密钥登录,AKSK可以在我的凭证下进行创建和管理,具体为:1).进入我的凭证2).选中管访问密钥,改密钥如果遗失,仅能通过删除重建进行重置。3).通过新获得的密钥,登录OBS Browser4).打开OBS Browser,点中右上方用户信息,选择账号管理,在账号管理中,输入上面的信息,在确认后跳转到该账号5).登录成功后选择进入刚才添加的桶名obs-qian,在根目录下上传bak文件。    7.备份文件上传成功后就可以进入DRS服务,进行离线还原操作了。a.在页面上找到DRS数据库复制服务b.进入DRS控制台界面后,点击左侧离线迁移管理,再点击右侧创建迁移任务备注:如果你欠费了就看不到右边的创建迁移任务的按钮,请充值哦c.进入任务界面后在下方选中刚才上传备份文件的桶名,这是他会自动刷出该桶根目录下的所有.bak的备份文件,选中刚才上传的备份文件,点击下一步。备注:1.备份文件后缀必为.bak2.备份文件必须在桶的根目录下d.在目标RDS实例名选中你要还原的目标实例;该实例必须是SQL SERVER 2014或以上版本,在待还原数据库名输入你要还原的数据库名称,如果已有同名数据库存在于该目标实例上,请选中覆盖还原按钮。备注:1.目标实例的版本必须要大于等于你的备份文件源实例的版本,例如:你是从2014实例上备份下来的备份文件,你就只能在2014,2016实例上进行还原,无法还原到2008上2.待还原数据库名称需要注意大小写,必须跟备份文件中的数据库名称一致。e.点击下一步,最后生成离线迁移任务,并在离线迁移管理界面可查看到该任务的进展。备注:1.迁移过程中请耐心等待,原则上100G大小的备份文件还原只需要1小时2.迁移过程失败会有详细的报错提示,可根据报错提示修改对应设置再行上传,如有问题可联系在线客服或提工单寻求帮助f.迁移任务成功后可通过实例管理界面登录功能连接在线实例进行查看。1)进入关系型数据库管控面,点击登录2)在弹出页面输入该实例rdsuser主账号+密码,即可登入Das在线管理工具。3)登入后我们可以看到AdventureWorks数据库已经还原成功,大家快去使用吧。备注:DAS是华为公有云RDS全新上线的在线数据库管理工具,兼容MYSQL&SQL SERVER,便捷易用,目前公测中,申请入口:http://www.huaweicloud.com/product/das.html 微软官方学习链接:微软培训体系:https://www.microsoft.com/zh-cn/learning/sql-training.aspx 微软认证体系;https://www.microsoft.com/zh-cn/learning/sql-certification.aspx SQL SERVER 2014在线学习:了解核心数据库概念 (20–25%)了解数据在表中的存储方式了解什么是表,它与将存储在数据库内的数据有怎样的关系;列/字段,行/记录了解关系数据库概念了解什么是关系数据库,关系数据库管理系统      (RDBMS) 的需求,以及如何建立关系了解数据操作语言      (DML)了解什么是      DML,了解它在数据库中的角色了解数据定义语言      (DDL)了解如何使用 T-SQL      创建数据库对象,例如表和视图MSDN官方资料:设计表3 - 实施关系数据库数据操作语言 (DML) 语句 (Transact-SQL) 创建数据库对象 (20–25%)选择数据类型了解什么是数据类型,数据类型重要意义所在,以及数据类型对存储需求的影响了解表和如何创建表表的用途;使用恰当的      ANSI SQL 语法在数据库中创建表创建视图了解何时使用视图,如何使用      T-SQL 或图形设计器创建视图创建存储过程和函数选择、**、更新或删除数据MSDN官方资料:发布数据和数据库对象CREATE TABLE (Transact-SQL)如何:创建视图 (Visual Database Tools)  操作数据 (25–30%)选择数据利用 SELECT      查询从一个表中提取数据,使用联接提取数据,使用 UNION 和 INTERSECT 合并结果集**数据了解如何将数据**数据库,如何使用      INSERT 语句更新数据了解如何使用恰当的      UPDATE 语句更新数据库内的数据,如何将更新后的数据写入数据库,如何使用表进行更新删除数据从一个或多个表中删除数据,使用事务确保数据完整性和参照完整性MSDN官方资料:使用 SqlDataSource 控件选择数据演练:使用 LinqDataSource 和 DetailsView 控件检索、更新、**和删除数据如何:从数据库中删除行 (LINQ to SQL) 了解数据存储 (15–20%)了解规范化了解规范化的原因,五种最常见的规范化级别,如何将数据库规范化为第三种规范形式了解主键、外键和组合键了解数据库中使用键的原因,选择恰当的主键,为键选择恰当的数据类型,为组合键选择恰当的字段,了解外键与主键之间的关系了解索引了解聚集索引和非聚集索引及其在数据库中的用途MSDN官方资料:使用键如何:在查询中处理组合键 (LINQ to SQL)使用索引 管理数据库 (10–15%)了解数据库安全概念了解保护数据库的需求、可保护的对象以及应保护的对象,了解用户帐户和角色了解数据库备份和还原了解各种备份类型,例如完整备份和增量备份,备份的重要性,如何还原数据库MSDN官方资料:SQL Server 安装的安全性考虑因素SQL Server 安全性 (ADO.NET)在 SQL Server 中备份和还原数据库
  • [技术干货] 将本地备份文件上传OBS,并还原到RDS SQL SERVER实例
    适用场景:1.用户可以将本地实例上的数据库通过全量备份生成备份文件,并通过OBS服务与DRS服务,将该备份文件直接还原到RDS SQL SERVER实例上2.用户从本地备份出来的备份文件的版本必须小于等于要还原的目标实例的版本。例如:你本地是2012标准版的实例,你备份出来的文件就只能还原到2014,2016标准版或企业版,不能还原到2008 的所有版本,和2014,2016的Web版上 操作步骤:1.首先备份你的本地实例上的一个数据库或多个数据库到一个备份文件中,备份文件后缀必须为.bak。脚本命令如下,我们可以将多个数据库备份到同一个备份文件中,也可分开来备份:BACKUP DATABASE [AdventureWorks] TO  DISK = N'D:\RDSDBDATA\BACKUP\LocalDatabase.bak' WITH NOFORMAT, NOINIT,  NAME = N'本地备份文件上传RDS [AdventureWokrs]', SKIP, NOREWIND, NOUNLOAD,  STATS = 10 BACKUP DATABASE [CBC] TO  DISK = N'D:\RDSDBDATA\BACKUP\LocalDatabase.bak' WITH NOFORMAT, NOINIT,  NAME = N'本地备份文件上传RDS [AdventureWokrs]', SKIP, NOREWIND, NOUNLOAD,  STATS = 10 BACKUP DATABASE [RDM_Count] TO  DISK = N'D:\RDSDBDATA\BACKUP\LocalDatabase.bak' WITH NOFORMAT, NOINIT,  NAME = N'本地备份文件上传RDS [AdventureWokrs]', SKIP, NOREWIND, NOUNLOAD,  STATS = 10 2.在备份前,需要对每一个数据库进行以下信息的确认:1.点击数据库属性,确认该数据库的恢复模式必须是完整;兼容性级别必须大于等于100;如果不是请更新该数据库,避免迁移报错2.同时数据库的恢复模式请改为完整 3.完成以上工作后,我们账号登录华为云官网,进入对象存储服务 4.我们在上面先创建一个公共桶。注意:1.该桶所在区域必须跟RDS SQL SERVER 实例所在区域一致  2.该桶最好设置为公共读写5.桶建好之后,可以直接通过在线页面能进行上传点击刚才生成的桶,在对象里面可以上传文件到根目录。注意:1.小于50M的文件支持页面上传2.目前DRS服务仅支持根目录上的备份文件上传,所以请直接上传文件,不要添加文件夹 6.如果你的备份文件大于50M,则需要下载OBS客户端进行上传操作。a.工具下载地址:https://developer.huaweicloud.com/toolsb.选择业务工具,下载OBS Browser工具 到本地,下载完成后可直接解压使用c.解压后双机obs.exe打开客户端通过AKSK密钥登录,AKSK可以在我的凭证下进行创建和管理,具体为:1).进入我的凭证2).选中管访问密钥,改密钥如果遗失,仅能通过删除重建进行重置。3).通过新获得的密钥,登录OBS Browser4).打开OBS Browser,点中右上方用户信息,选择账号管理,在账号管理中,输入上面的信息,在确认后跳转到该账号5).登录成功后选择添加桶,选择添加外部桶,输入下载页面上给出的桶名6).添加成功后点击进入该桶,在根目录下上传bak文件。 7.备份文件上传成功后就可以进入DRS服务,进行离线还原操作了。a.在页面上找到DRS数据库复制服务b.进入DRS控制台界面后,点击左侧离线迁移管理,再点击右侧创建迁移任务备注:如果你欠费了就看不到右边的创建迁移任务的按钮,请充值哦c.进入任务界面后在下方选中刚才上传备份文件的桶名,这是他会自动刷出该桶根目录下的所有.bak的备份文件,选中刚才上传的备份文件,点击下一步。备注:1.备份文件后缀必为.bak2.备份文件必须在桶的根目录下d.在目标RDS实例名选中你要还原的目标实例;在待还原数据库名输入你要还原的数据库名称,如果已有同名数据库存在于该目标实例上,请选中覆盖还原按钮。备注:1.目标实例的版本必须要大于等于你的备份文件源实例的版本,例如:你是从2014实例上备份下来的备份文件,你就只能在2014,2016实例上进行还原,无法还原到2008上2.待还原数据库名称需要注意大小写,必须跟备份文件中的数据库名称一致。e.点击下一步,最后生成离线迁移任务,并在离线迁移管理界面可查看到该任务的进展。备注:1.迁移过程中请耐心等待,原则上100G大小的备份文件还原只需要1小时2.迁移过程失败会有详细的报错提示,可根据报错提示修改对应设置再行上传,如有问题可联系在线客服或提工单寻求帮助f.迁移任务成功后可通过实例管理界面登录功能连接在线实例进行查看。1)进入关系型数据库管控面,点击登录2)在弹出页面输入该实例rdsuser主账号+密码,即可登入Das在线管理工具。3)登入后我们可以看到3个数据库已经全部还原成功,大家快去使用吧。备注:DAS是华为公有云RDS全新上线的在线数据库管理工具,兼容MYSQL&SQL SERVER,便捷易用,目前公测中,申请入口:http://www.huaweicloud.com/product/das.html
  • [技术干货] RDS SQL SERVER 参数组最佳实践
    使用说明:实例参数修改:1.每一个实例都有自己唯一的参数组,在实例管理页面-->实例详情页-->参数修改 2.每个实例的参数都是唯一的修改后不会对其他实例产生影响 参数组管理:系统默认:1.每个SQL SERVER 版本都有对应的唯一默认参数组模板:        2.选中对应版本的模板,点击更多下面的应用,可将该默认参数组模板上的参数覆盖选中的实例对应参数 备注:默认参数组中的所有参数组都是不可以修改的。 自定义:1.同时你可以在自定义页面下根据一个默认参数组模板来创建自定义参数组。 2.创建的自定义参数组可以有限的修改其中部分参数的值,修改完成后点击保存,同时可将该自定义参数组应用到对应版本的多个实例上。          更具不同的场景来配置你的参数值:SQL SERVER 的默认参数组模板中已经给出了不同版本下的参数值最佳实践,我们仅需要针对不同场景改动如下参数即可有效的控制实例匹配对的场景。max degree of parallelism:参数说明:每个执行语句的CPU最大并行度,该参数值默认为0,当你在使用实例时,SQL SERVER会通过查询引擎自动的给你的每一个请求分配CPU执行计划,以通过并行执行的方式有效提升你的执行性能。参数值对应的场景:1.当你本地实例以查询获取结果为主,该参数值为02.当你本地实例以写入,更新,删除为主,该参数可设置为1 max server memory (MB)参数说明:该参数用于控制实例上SQL SERVER数据库服务占用整个服务器的最大内存的上限参数值对应的场景:华为RDS SQL SERVER已经根据你的每个实例自身大小做出了对应的适当配置,该值你可不必更改,如果实在要改请注意以下限制条件。1.不能低于2G2.不能高于你实例最大内存的95% user connections参数说明:该参数用户控制实例上用户发起的最大连接数参数值对应的场景:该参数目前默认为1000,可根据实际情况进行调整。1.设置为0,该实例连接数不受限制2.不能设置1-10之间的值 
  • [技术干货] 通过Navicat客户端,连接使用RDS SQL SERVER 需要注意的事项
    适用场景:用户本地长期使用Navicat等三方客户端,在上云到RDS SQL SERVER后需要在连接和创建数据库的时候注意一些配置选项。 推荐:目前华为云RDS SQL SERVER是可以完美适配SQL SERVER官方客户端SSMS的推荐大家选用。官网最新下载地址:https://docs.microsoft.com/zh-cn/sql/ssms/sql-server-management-studio-changelog-ssms?view=sql-server-2017 使用帮助:同时,我们也发现大量的小伙伴在使用一些比较流行的三方客户端工具的时候出现了一些适配问题,在下面我将主要针对Navicat这款当前比较流行的三方数据库客户端工具,连接RDS SQL SERVER数据库服务进行操作上的一些问题进行详细说明:1.在打开NAVICAT客户端后点击连接弹出客户连接界面,在界面上需要输入一个连接名称,同时需要输入你的实例IP+端口号,rdsuser主账号加密码,点击连接测试成功后再确定,就可以连接到实例了。备注:注意IP和端口之间用英文逗号隔开',' 2.连接到实例后下一步就是开始创建数据库,右键实例选择新建数据库第一步,输入数据库名称,拥有者推荐选择rdsuser主账号,排序规则最好跟实例默认规则一致,查询实例默认排序规则脚本如下:SELECT SERVERPROPERTY('Collation')恢复模式必选FULL,不然该数据库不会纳入备份策略兼容性级别跟据需要选择100以上即可 第二步,文件组一般情况下无需修改第三步,文件中文件目录必须是D:\RDSDBDATA\DATA\,这个地址是RDS实例唯一允许建库地址,同时修改完mdf的数据文件后,还要注意同时修改下面的log文件名,修改日志的文件目录同数据文件目录,其余选项根据需要设置就好。 第四步,最后点SQL预览,脚本大致如下,点击确定数据库创建成功CREATE DATABASE [Test20180717]ON PRIMARY(NAME = N'Test20180717',FILENAME = N'D:\RDSDBDATA\DATA\Test20180717.mdf',SIZE = 2304KB,MAXSIZE = UNLIMITED,FILEGROWTH = 1024KB)LOG ON(NAME = N'Test20180717_log',FILENAME = N'D:\RDSDBDATA\DATA\Test20180717_log.ldf',SIZE = 2304KB,MAXSIZE = UNLIMITED,FILEGROWTH = 10%)COLLATE Chinese_PRC_CI_AS GO EXEC [Test20180717].dbo.sp_changedbowner N'rdsuser'GO 根据以上步骤建库建表成功后,下面的具体操作通过T-sql语句来进行执行问题就不大了。同时我们可以看到在缺乏管理员权限的支撑下,三方工具的友好性的确大打折扣,所以强烈推荐大家还是尽量使用官方客户端SSMS,是完全免费下载使用的。
  • [技术干货] 本地SQL SERVER 数据库通过导入导出功能迁移到RDS SQL SERVER Step by Step
    适用场景:1.用户在本地实例上创建的SQL SERVER数据库2本地SQL SERVER实例的版本高于RDS SQL SERVER实例的版本时,无法通过DRS提供的备份还原进行迁移3.不想进行数据库粒度的同步,仅针对其中个别表对象进行同步 操作步骤:1.需给你的RDS SQL SERVER实例绑定一个EIP点击实例管理,在基本信息下点击弹性IP绑定,通过弹出框选中对应的弹性IP。2.在本地安装SQL SERVER客户端管理工具,通过弹性IP进行连接微软官网客户端下载地址(注意根据本地环境的语言选择下载安装包):https://docs.microsoft.com/zh-cn/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-2017下载完成后通过客户端工具测试连接目标实例:你可以在本地同时连接本地实例&RDS实例3.通过SQL SERVER自带的脚本生成工具,将ECS上的数据库结构脚本化生成出来,步骤如下:a.选中要生成schema脚本的数据库,点击鼠标右键选择任务-->生成脚本    b.在导航页中根据提示选择下一步,并确认要导出的对象,可选全部,也可以选择独立对象模块导出c.下一步,选择将要导出的文件保存到对应的位置(推荐保存到本机上生成一个SQL 脚本方便保存执行)d.同时点击高级按钮进入详细选项页面,根据实际需要选择具体脚本生成规则和相关细节,例如:触发器,索引,唯一键,主键,服务器版本等重要选项。特别注意:脚本Drop 和 Create;要编写脚本的数据的类型两个重要选项e.最后点击下一步完成脚本生成5.将生成的脚本SQL 文件在SSMS上打开,连接到RDS对应实例上,先创建一个空数据库,再通过刚才创建的脚本在该数据库上执行,以创建相关结构。6.完成以上步骤后通过SQL SERVER自带的导入导出功能完成数据迁移,步骤如下:a.选择要导出数据库的数据库,右键点击选择任务-->导出数据   b.根据导航选择下一步,在选择数据源里面数据源:选择SQL SERVER Native Client(该选项根据你的数据源类型进行选择)服务器名称:输入数据源实例所在的IP加端口号,如果是本地可以直接输入实例名或者localhost身份验证:选择使用SQL SERVER身份验证,并在下方输入rdsuser账号和密码最后选中你要导出的数据库作为数据源c.在选择目标栏目中,一切同上,主要选择数据库的时候要选中要导入的对应数据库,然后点击下一步,选中复制一个或多个表或视图的数据d.在选择源表和视图中,根据需要的选择导出的对象进行选中,可通过shift进行多选,注意一般会去掉后面的对应视图。此时如果该对应已经在目标库上创建完则会自动根据名称进行匹配,如果没有则会自动生成初始框架不带索引,外键。e.关键来了,全选你要导出的所有对象,再点编辑映射,根据实际需要进行选择,但是至少要选中启用标识**f.后面点击下一步开始数据导出导入进度查看,一般效率为4000行/秒 备注:在整体流程中架构同步相关的步骤可以是不做的,但是迁移过去的仅包含相关数据,结构可能不一致;同时如果先做了架构同步后再迁移数据库,数据迁移过程可能会因为架构约束导致失败(如:外键约束,自增长键,timestamp),所以具体实现过程中请大家根据实际情况选择性操作。
  • [技术干货] ECS 上的SQL SERVER数据库通过导入导出功能迁移到RDS SQL SERVER Step by Step
    适用场景:1.用户在ECS上创建的SQL SERVER数据库2.当你ECS上SQL SERVER实例的版本高于RDS SQL SERVER实例的版本时,无法通过DRS提供的备份还原进行迁移3.不想进行数据库粒度的同步,仅针对其中个别表对象进行同步 操作步骤:1.创建一个ECS虚拟机,注意虚拟机跟对应的RDS应在通Region,同VPC下2.在ECS上安装的SQL SERVER 2014,2012,2008版本,至少是标准版,最好跟要还原的目标实例版本一致3.将本地bak文件上传至ECS服务器端,并通过该ECS上的SQL SERVER服务器进行本地还原4.通过SQL SERVER自带的脚本生成工具,将ECS上的数据库结构脚本化生成出来,步骤如下:a.选中要生成schema脚本的数据库,点击鼠标右键选择任务-->生成脚本b.在导航页中根据提示选择下一步,并确认要导出的对象,可选全部,也可以选择独立对象模块导出c.下一步,选择将要导出的文件保存到对应的位置(推荐保存到本机上生成一个SQL 脚本方便保存执行)    d.同时点击高级按钮进入详细选项页面,根据实际需要选择具体脚本生成规则和相关细节,例如:触发器,索引,唯一键,主键,服务器版本等重要选项。特别注意:脚本Drop 和 Create;要编写脚本的数据的类型两个重要选项    e.最后点击下一步完成脚本生成5.将生成的脚本SQL 文件在SSMS上打开,连接到RDS对应实例上,先创建一个空数据库,在通过该脚本在该数据库上创建相关结构。6.完成以上步骤后通过SQL SERVER自带的导入导出功能完成数据迁移,步骤如下:a.选择要导出数据库的数据库,右键点击选择任务-->导出数据    b.根据导航选择下一步,在选择数据源里面数据源:选择SQL SERVER Native Client(该选项根据你的数据源类型进行选择)服务器名称:输入数据源实例所在的IP加端口号,如果是本地可以直接输入实例名或者localhost身份验证:选择使用SQL SERVER身份验证,并在下方输入rdsuser账号和密码最后选中你要导出的数据库作为数据源c.在选择目标栏目中,一切同上,主要选择数据库的时候要选中要导入的对应数据库,然后点击下一步,选中复制一个或多个表或视图的数据d.在选择源表和视图中,根据需要的选择导出的对象进行选中,可通过shift进行多选,注意一般会去掉后面的对应视图。此时如果该对应已经在目标库上创建完则会自动根据名称进行匹配,如果没有则会自动生成初始框架不带索引,外键。e.关键来了,全选你要导出的所有对象,再点编辑映射,根据实际需要进行选择,但是至少要选中启用标识**    f.后面点击下一步开始数据导出导入进度查看,一般效率为4000行/秒         备注:在整体流程中架构同步相关的步骤可以是不做的,但是迁移过去的仅包含相关数据;同时如果先做了架构同步后再迁移数据库,数据迁移过程可能会因为架构约束导致失败,所以具体实现过程中请大家根据实际情况选择性操作。
  • [技术干货] RDS SQL SERVER 快照下载Step by Step
    1.首先通过客户端连接到你的实例,确认你当前RDS实例上的数据库的兼容级别跟你要还原到本地实例上的数据库版本:选中该数据库,右键属性,点击选项,确认兼容性级别。备注:备份文件仅能还原到同版本或高板的数据库实例上,例如:2014实例上备份下来的数据库就不能还原到2012实例,即便他的兼容性级别是一致的也不行!2.回到管控面,点击备份管理,根据你的要求选中你要下载的手动快照或自动快照,并点击下载,进入下载页面。3.进入下载页面后,根据提示步骤进行: a.下载华为云官网最新OBS Browser工具b.打开该工具,通过AKSK密钥登录,AKSK可以在我的凭证下进行创建和管理,具体为:1).进入我的凭证2).选中管访问密钥,改密钥如果遗失,仅能通过删除重建进行重置。3).通过新获得的密钥,登录OBS Browser4).打开OBS Browser,点中右上方用户信息,选择账号管理,在账号管理中,输入上面的信息,在确认后跳转到该账号5).登录成功后选择添加桶,选择添加外部桶,输入下载页面上给出的桶名6).添加成功后点击进入该桶,并输入下载页面中的具体备份文件名,选中后进行下载到本地。4.根据下载到本地的文件,通过数据库还原脚本进行还原USE [master]RESTORE DATABASE [DBName] FROM  DISK = N'D:\temp\01a97e94b83c421386b8161f2aff1cdc_36a22d4e01e34945b70e4999021b731din04_Db_fb114c9070ff403ba042273af301c2afbr04_20180305050650014_20180305050712106_2a0eb1b4d3b6405eb1e5ea069c0a58c7no04_.tar.gz' WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 5备注:该文件无需解压!直接使用,觉得备份文件名字长可以改短点(文中脚本仅供参考,以用户自身实际场景为主)。
  • [技术干货] 华为云RDS SQL SERVER 适配Navicat客户端工具
    目前华为云RDS SQL SERVER是可以完美适配SQL SERVER官方客户端SSMS的推荐大家选用。官网最新下载地址:https://docs.microsoft.com/zh-cn/sql/ssms/sql-server-management-studio-changelog-ssms?view=sql-server-2017 同时,我们也发现大量的小伙伴在使用一些比较流行的三方客户端工具的时候出现了一些适配问题,在下面我将主要针对Navicat这款当前比较流行的三方数据库客户端工具,连接RDS SQL SERVER数据库服务进行操作上的一些问题进行详细说明:1.在打开NAVICAT客户端后点击连接弹出客户连接界面,在界面上需要输入一个连接名称,同时需要输入你的实例IP+端口号,rdsuser主账号加密码,点击连接测试成功后再确定,就可以连接到实例了。备注:注意IP和端口之间用英文逗号隔开',' 2.连接到实例后下一步就是开始创建数据库,右键实例选择新建数据库第一步,输入数据库名称,拥有者推荐选择rdsuser主账号,排序规则最好跟实例默认规则一致,查询实例默认排序规则脚本如下:SELECT SERVERPROPERTY('Collation')恢复模式必选FULL,不然该数据库不会纳入备份策略兼容性级别跟据需要选择100以上即可 第二步,文件组一般情况下无需修改第三步,文件中文件目录必须是D:\RDSDBDATA\DATA\,这个地址是RDS实例唯一允许建库地址,同时修改完mdf的数据文件后,还要注意同时修改下面的log文件名,修改日志的文件目录同数据文件目录,其余选项根据需要设置就好。 第四步,最后点SQL预览,脚本大致如下,点击确定数据库创建成功CREATE DATABASE [Test20180717]ON PRIMARY(NAME = N'Test20180717',FILENAME = N'D:\RDSDBDATA\DATA\Test20180717.mdf',SIZE = 2304KB,MAXSIZE = UNLIMITED,FILEGROWTH = 1024KB)LOG ON(NAME = N'Test20180717_log',FILENAME = N'D:\RDSDBDATA\DATA\Test20180717_log.ldf',SIZE = 2304KB,MAXSIZE = UNLIMITED,FILEGROWTH = 10%)COLLATE Chinese_PRC_CI_AS GO EXEC [Test20180717].dbo.sp_changedbowner N'rdsuser'GO 根据以上步骤建库建表成功后,下面的具体操作通过T-sql语句来进行执行问题就不大了。同时我们可以看到在缺乏管理员权限的支撑下,三方工具的友好性的确大打折扣,所以强烈推荐大家还是尽量使用官方客户端SSMS,是完全免费下载使用的。
  • 分布式数据库中间件 如何选择合适的分布式事务模型
    开始前先撒一波福利,感兴趣的小伙伴抓住机会哦。官网正在进行一系列的体验活动,了解更多详情请移步官网看看大大大福利~~各种配置太麻烦? 轻轻的点击下图,试试一键式免费开通DDM实例华为云分布式数据库中间件DDM当前支持单机、最大努力提交、最终一致性和强一致性四种事务模型,详情如下表所示。事务模型   优势不足单机执行效率高,由底层数据库提供强一致性的保证。如果事务涉及到多分片,DDM将拒绝执行,返回错误。最大努力提交支持跨分片事务,执行结果相对独立,互不干涉。执行效率低于单机。如果有分片提交失败时,不提供事务补偿,因此会出现部分执行成功部分执行失败。最终一致性支持跨分片事务,且保证各分片事务最终执行结果一致。执行效率低于最大努力提交。如果有分片提交失败时,会进行事务补偿,事务补偿阶段,客户端查询结果不是最新结果(即存在中间状态)。强一致性支持跨分片事务,在最终一致性基础上,增强了事务一致性保证,即任何时间点各分片的数据都是事务结束后的。执行效率低于最终一致性。在事务执行结束前可能存在等待。注意:DDM的事务模型建立在逻辑库层面上,一个逻辑库只能选择一种事务模型。在创建逻辑库时需要规划好存储的数据结构与SQL的需求,如是否需要跨分片,是否必须保证事务强一致性等,根据需求选择合适的事务模型。单机基本概述只能在单个分片上执行,如果事务涉及到多分片,DDM将拒绝执行,返回错误。原理下图所示。适用场景适合业务拆分比较合理,在应用层有独自完善的事务处理框架,到DDM的事务都是单分片事务,单分片事务由底层数据库提供强一致性的保证。单机事务模型下,如果出现跨分片的事务,会报错进行提示,避免达不到预期目的。图1 单机最大努力提交基本概述事务在各分片上分别提交,互不干涉,提交结果尽最大可能保持一致,但有部分提交成功部分提交失败的可能,原理如下图所示。适用场景适合绝大部分不涉及金钱往来的业务,在性能和一致性之间比较好的一个平衡。事务中commit时因为是往多个节点发送执行,有部分commit成功部分commit失败的可能性,但是可能性比较低,只有在commit的时间窗内出现异常才有可能出现此种情况。图1 最大努力提交最终一致性基本概述事务在各分片上的提交结果不保证始终一致,如果有分片提交失败,DDM会对其他提交成功的分片提供补偿机制撤消之前的修改,从而确保各分片事务状态最终一致。原理跟强一致性类似,请参见强一致性。说明:最终一致性与强一致性原理基本一致,区别在于:最终一致性场景下,如有并发的查询请求,查询到的结果可能事务处理中部分分片已完成提交的结果,即存在中间状态。强一致性场景下,如有并发的查询请求,查询结果是事务提交完成后的结果,即不存在中间状态。适用场景适合对一致性要求比较高的场景,最终一致性解决了最大努力提交模型下部分commit成功部分失败的问题。如果对部分读的sql一致性要求比较高,还可以通过select for update或者lock in share mode来避免读取到不一致状态(部分成功部分失败)。例如:select col1, col2,...coln from table1 where col1={拆分键} for update;select col1, col2,...coln from table1 where col1={拆分键} lock in share mode;where条件中建议带上拆分键。强一致性基本概述在最终一致性基础上,增强了事务一致性保证,即任何时间点,各分片的数据都是事务开始前或者事务提交后的。原理如下图所示。适用场景适合对一致性有极端要求的场景,既要保证提交原子性、并且所有查询都必须避免脏读。一致性级别越高,付出性能代价会越大,请根据业务需要选择合适的模型。说明:在强一致性模型下,为了保证强一致性,会对所有select加共享锁,共享锁在对同一条数据并发加锁或解锁时可能会导致死锁,请根据业务场景,对相关select加排它锁for update进行规避。