问题来自
http://www.cnblogs.com/fygh/archive/2011/10/18/2216166.html
https://www.cnblogs.com/riont/p/3909622.html
1. char、varchar、nvarchar之间的区别(包括用途和空间占用);xml类型查找某个节点的数据有哪些方法,哪个效率高;使用存储过程和使用T-SQL查询数据有啥不一样;
① char、varchar、nvarchar之间的区别
所以一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar
参考
https://blog.csdn.net/zzq900503/article/details/17131407
https://blog.csdn.net/yue1453544229/article/details/81187108
② xml类型查找某个节点的数据有哪些方法,哪个效率高
xml的数据类型,在存储序列化数据的时候比较有用,还有就是配置文件。
@xml.query()得到的结果也是xml
@xml.value()得到的结果可以转换成int/varchar等。。。
@xml.exist()检查是否包含某个节点
@xml.modify()可以修改里面的内容
效率:exist>query>value --这只是我的理解,exist只是检查路径,query没有转换,value需要转换。
XML类型查找数据的方法:query方法用于从XML数据类型提取XML;value方法用于从XML文档中返回单个值;exist方法用于确定指定节点是否存在于XML文档中。
这几个查找数据的方法谈不上哪个效率更高,每个都有它的用途;
③使用存储过程和使用T-SQL查询数据有啥不一样
存储过程在创建时就进行了编译,以后调用时不在需要编译了,速度快。而T-sql语句每次执行时都会进行编译一次的,会浪费很多时间,而且速度慢。但是,存储过程一次编译可能会由于参数窥探的问题导致传入某些变量时使用不合适的执行计划,而T-SQL由于每次编译,不会有这样的问题。
2. 系统DB有哪些,都有什么作用,需不需要做备份,为什么;损坏了如何做还原(主要是master库);
①系统DB有哪些,都有什么作用,需不需要做备份,为什么
1. Master库:
2. Model库:
3. Msdb数据库:
4. Tempdb数据库:
5. Resource数据库:
② 如何在一台新服务器上还原数据库
net start MSSQKSERVER /m
sqlcmd -E -S sql2005pc
restore database master from disk=’备份文件路径’
go
sqlserver服务自动停止
由于恢复的master数据库里记载的其他数据库的路径和现在的路径不一致,这时候重新启动SqlServer失败。必须要用跟踪标志3608来启动。
net start MSSQLSERVER /f /m /T3608
sqlcmd -E -S sql2005pc
alter database msdb modify file(name=data,filename=’正确路径\xxx.mdf’);
alter database msdb modify file(name=log,filename=’正确路径\xxx.ldf’);
alter database mssqlsystemresource modify file(name=data,filename=’正确路径\xxx.mdf’);
alter database mssqlsystemresource modify file(name=log,filename=’正确路径\xxx.ldf’);
alter database model modify file(name=data,filename=’正确路径\xxx.mdf’);
alter database model modify file(name=log,filename=’正确路径\xxx.ldf’);
alter database tempdb modify file(name=data,filename=’正确路径\xxx.mdf’);
alter database tempdb modify file(name=log,filename=’正确路径\xxx.ldf’);
net stop MSSQLSERVER
net start MSSQLSERVER
此时,SqlServer可以正常启动,但它使用的数据库除了master以外都是备用服务器自己的,我们需要用生产库的备份来替换他们。
关闭SqlServer agent服务,利用restore命令恢复,将其指向新的文件路径
Restore database msdb from disk ‘C:\lab\msdb.bak’ with move ‘MSDBData’ to ‘备用服务器数据msdb数据文件’,move ‘MSDBlog’ to ‘备用服务器数据msdb日志文件’,replace
Restore database model from disk ‘C:\lab\ model.bak’ with move ‘modeldev’ to ‘备用服务器数据model数据文件’,move ‘modellog’ to ‘备用服务器数据model日志文件’,replace
sp_dropserver 备用服务器名
go
sp_addserver ‘SQL2005PC’,’local’
go
此时,原先SqlServer索引配置都能恢复到新服务器上,接下来将用户数据库逐个恢复即可。
3. 有哪些操作会使用到TempDB;如果TempDB异常变大,可能的原因是什么,该如何处理;
① 哪些操作会使用到TempDB
② 如果TempDB异常变大,可能的原因是什么,该如何处理
可能原因:
Sql语句执行计划中使用了merge join或hash join使用了大量排序
语句使用临时表过大、语句排序过多、CheckDB等
如何处理:
语句优化;控制临时表大小;适当增加tempdb大小;可以考虑在同一台服务器上安装多个实例每个实例都有它自己的tempdb,可以有效地分散tempdb的使用
4. Index有哪些类型,它们的区别和实现原理是什么,索引有何优点和缺点;如何为SQL语句创建合适的索引,索引创建时有哪些需要注意的项,如何查看你创建的索引是否被使用;如何维护索引;索引损坏如何检查,怎么修复;T-SQL有更好的索引存在,但是运行时并没有使用该索引,原因可能是什么;
索引的好处还是大于坏处的,堆表的性能在高并发的随机读写远落后与有聚集索引的表
建议的索引设计策略:
注意事项:
参考:
https://docs.microsoft.com/zh-cn/sql/2014-toc/sql-server-index-design-guide?view=sql-server-2014
sys.dm_db_index_usage_stats
select * from sys.dm_db_index_usage_stats where database_id=DB_ID('DBNAME');
关注user_seek/user_scan/user_lookup,这三个值,如果你的表很忙,但这些值都偏小,可能你的sql没有很好的利用索引。
定期的检查索引的碎片情况,根据碎片进行索引的重建或者重新组织
select * from sys.dm_db_index_physical_stats(DB_ID('tempdb'),null,null,null,null);
-- 关注:avg_fragmentation_in_percent字段
-- 一般在10%以内算优,30%考虑reorgnize,70%rebuild...
对从未使用过的索引,考虑与业务方沟通确认后删除
一般会在业务低峰的时候检查表数据检查dbcc checktable,检查其结果,如果有错误则尝试使用dbcc checktable的repair选项,或者还原数据库表。
变量窥探
统计信息不准确
Sql中指定了hint或执行计划
查询返回的数据量过大
5. 视图上我们能建索引吗,如果能建的话,会啥好处和坏处;视图上建索引和表上建索引有啥区别
索引视图可以看作是一个和表(Table)等效的对象,会将数据物理存在数据库中,所存的数据和索引视图中所涉及的底层表保持同步(类似Oracle中的Materialized View)
对于涉及对大量的行进行复杂处理的视图,由于结果集已经保存为一张带有聚集索引的表,因此无需重新计算,索引视图有明显的速度优势。
即使未在 FROM 子句中指定使用视图,查询优化器也可以使用索引视图。这样一来,可从索引视图检索数据而无需重新编码,设计良好的索引视图可以加快许多查询的处理速度
http://blog.51cto.com/jimshu/1257306
https://blog.csdn.net/3150379/article/details/44536019
http://www.cnblogs.com/CareySon/archive/2011/12/07/2279522.html
6. Job信息我们可以通过哪些表获取;系统正在运行的语句可以通过哪些视图获取;如何获取某个T-SQL语句的IO、Time等信息
① Job信息我们可以通过哪些表获取
所有的作业定义,日志,历史等,都存储在msdb的sysjob* 系统表中
msdb.dbo.sysjobactivity:代理作业的活动和状态
msdb.dbo.sysjobhistory:作业历史
msdb.dbo.sysjobs: 作业定义
msdb.dbo.sysjobschedules:作业计划
msdb.dbo.sysjobservers: 作业与特定的server关联或关系msdb.dbo.sysjobsteps: 作业步骤
msdb.dbo.sysjobstepslogs: 所有SQL Server 代理作业步骤的作业步骤日志
②系统正在运行的语句可以通过哪些视图获取
sys.dm_exec_requests:返回有关在SQL Server中正在执行的每个请求的信息sys.sysprocesses:包含有关在SQL Server实例上运行的进程的信息。这些过程可以是客户端进程或系统进程。类似于v$session
sys.dm_exec_sql_text:返回由指定的sql_handle标识的SQL批处理的文本
③如何获取某个T-SQL语句的IO、Time等信息
set statistics io
set statistics time
或
sys.dm_exec_query_stats
7. 在线系统,一个表有五千万记录,现在要你将其中的两千万条记录导入到另一台服务器的某个表中,导完后,需要将这两千万数据删除,你预备如何处理,优缺点是什么;
http://www.cnblogs.com/gezifeiyang/archive/2011/10/22/2219631.html
8. 数据库服务器报磁盘空间不足,你将如何应对,要求尽快恢复
https://www.cnblogs.com/gaizai/archive/2012/11/27/2790251.html
9. 临时表、表变量、CTE(通用表表达式)有啥区别和联系,保存位置有啥不一样,使用时如何决定选哪种
类型 |
定义 |
存储位置 |
作用域 |
适用场景 |
临时表 |
以#开头的局部临时表
以##开头的全局临时表 |
都存放在tempdb数据库中 |
局部临时表:对当前连接有效,只在创建它的存储过程、批处理、动态语句中有效,类似于C#语言中局部变量的作用域。
|
数据量小直接当做中间表使用 数据量较大可以通过优化提高查询效率 对于复杂的查询可以将中间结果放在临时表中以固化执行计划 |
表变量 |
类型为表的变量。 它的具体定义包括列定义,列名,数据类型和约束 |
存放在tempdb数据库中 |
在定义表变量的存储过程、批处理、动态语句、函数结束时,会自动清除。 表变量可以在其作用域内像正常的表一样使用 |
小数据量(百条以内) 注意:表变量不受事务的约束 |
CTE |
|
|
|
|
http://www.cnblogs.com/CareySon/archive/2012/06/11/TableVariableAndTempTable.html
https://www.cnblogs.com/suizhikuo/p/9285006.html
10. SQLServer有哪些隔离级别,默认级别是哪个;数据库有哪些主要的锁类型;行版本控制是如何实现的;
① SQLServer有哪些隔离级别,默认级别是哪个
级别 |
定义 |
未提交读 |
隔离事务的最低级别,只能保证不读取物理上损坏的数据。 在此级别上,允许脏读,因此一个事务可能看见其他事务所做的尚未提交的更改。 |
已提交读 |
默认级别。允许事务读取另一个事务以前读取(未修改)的数据,而不必等待第一个事务完成。 数据库引擎保留写锁(在所选数据上获取)直到事务结束,但是一执行 SELECT 操作就释放读锁。 这是数据库引擎默认级别。 |
可重复读 |
数据库引擎保留在所选数据上获取的读锁和写锁,直到事务结束。 但是,因为不管理范围锁,可能发生虚拟读取。 |
可序列化 |
隔离事务的最高级别,事务之间完全隔离。 数据库引擎保留在所选数据上获取的读锁和写锁,在事务结束时释放它们。 SELECT 操作使用分范围的 WHERE 子句时获取范围锁,主要为了避免虚拟读取。 |
②数据库有哪些主要的锁类型
锁模式 |
Description |
共享 (S) |
用于不更改或不更新数据的读取操作,如 SELECT 语句。 |
更新 (U) |
用于可更新的资源中。 防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。 |
排他 (X) |
用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。 确保不会同时对同一资源进行多重更新。 |
意向 |
用于建立锁的层次结构。 意向锁包含三种类型:意向共享 (IS)、意向排他 (IX) 和意向排他共享 (SIX)。 |
架构 |
在执行依赖于表架构的操作时使用。 架构锁包含两种类型:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。 |
大容量更新 (BU) |
时使用大容量复制数据到表和TABLOCK指定提示。 |
键范围 |
当使用可序列化事务隔离级别时保护查询读取的行的范围。 确保再次运行查询时其他事务无法插入符合可序列化事务的查询的行。 |
https://docs.microsoft.com/zh-cn/sql/2014-toc/sql-server-transaction-locking-and-row-versioning-guide?view=sql-server-2014
③ 行版本控制是如何实现的
当要更新表或索引上某行时,更新后的值会被标识上XSN的值,代表事务准备更新该数据。当开始更新时,该行的前一个版本会存储在version store中,新版本中则会包含一个指针来指向version store中的旧行。行的新旧版本通过指针关联,这个版本会持续到事务结束。
开启行版本控制后,sqlserver会把行版本存放在tempdb中。修改的数据越多,需要存的信息越多,对sqlserver额外的负载就越大。
SQL Server 还支持使用行版本控制的其他两个事务隔离级别。 一个是已提交读隔离的实现,另一个是事务隔离级别(快照)。
行版本控制隔离级别 |
定义 |
快照隔离级别(SNAPSHOT ISOLATION) |
当读取其他事务修改的行,它忽略数据的修改只从前版本的行读取数据,也就是说,即使其他事务已提交,它读取到的始终是修改前的版本。
当快照事务尝试修改已由其他事务修改的数据时,它将生成错误并终止。 |
已提交读快照隔离级别(READ COMMITTED SNAPSHOT ISOLATION) |
读取其他事务修改的行,在提交前,读取到的是修改前的版本;在提交后,读取到的是修改后的数据
它能够更新由其他事务修改的数据时 类似于Oracle的已提交读 |
《sqlserver 企业平台管理实战》
https://docs.microsoft.com/zh-cn/sql/2014-toc/sql-server-transaction-locking-and-row-versioning-guide?view=sql-server-2014#Row_versioning
11. 死锁如何跟踪;阻塞如何跟踪和查找;发现有问题的语句后,如何进行处理;
扩展事件,选择lock_deadlock和lock_deadlock_chain事件
DBCC TRACEON跟踪 1204及1222事件
利用sql profile中的死锁图形事件
通过连接sys.sysprocesses视图里waittype,open_tran,status字段值的组合来分析阻塞源头
(查询waittype对应等待类型select waittype,lastwaittype from sys.sysprocesses)
5种常见的阻塞类型
waittype |
open_tran |
status |
自我修复 |
原因/其他特征 |
不为0 |
>=0 |
runnable |
可以,当语句运行结束后 |
语句运行的时间比较长,运行时需等待某些系统资源(如硬盘读写、CPU或内存等)。 |
0x0000 |
>0 |
sleeping |
不能,但是如果运行 KILL语句,这个链接能够很容易被终止 |
可能客户端遇到了一个语句执行超时,或者主动取消了上一语句的执行,但是没有回滚开启的事务,在SQL Trace里能够看到一个Attention事件 |
0x0000 |
>=0 |
runnable |
不能。直到客户端把所有结果都主动取走,或者主动断开连接,可以运行KILL语句去终止它,但是可能要花长达30秒 |
客户端没有及时把所有结果都取走,这时可能open_tran=0,事务隔离级别也为默认(READ COMMITTED),但这个连接还会持有锁资源 |
0x0000 |
>0 |
rollback |
是的 |
在SQL Trace里能够看到这个SPID已经发来了一个Attention事件,说明客户端已经遇到了超时,或者主动要求回滚事务 |
各种值都有可能 |
>=0 |
runnable |
不能,直到客户端取消语句运行或者主动断开连接。可以运行KILL语句终止它,但是可能要花长达30秒 |
应用程序运行中产生死锁,在SQL Server中以阻塞形式体现。Sysprocesses里阻塞和被阻塞的连接hostname值是一样的 |
https://blog.csdn.net/wacthamu/article/details/10033463
解决方法:
要解决这一类阻塞,数据库管理员需要和数据库应用设计人员合作,共同解决以下问题。
这里包括修改语句本身降低复杂度、修改表格设计、调整索引等。
当SQL Server 遇到诸如内存、硬盘读写、CPU等资源瓶颈时,原来能很快完成的语句有可能会花很长时间。
这一类阻塞的特征,就是问题连接早就进入了空闲状态(sysprocesses.status=’sleeping’和sysprocesses.cmd=’AWAITING COMMAND’),但是,如果检查sysprocesses.open_tran,就会发现它不为0,以及事务没有提交。
这类问题很多都是因为应用端遇到一个执行超时,或者其他原因,当时执行的语句被提前终止了,但是连接还保留着。应用没有跟随发来的事务提交或回滚指令,导致一个事务被遗留在SQL Server里。
解决办法:
解决方法:
不管是在客户端退出,还是在服务器端KILL,为了维护数据库事务的一致性,SQL Server都会对连接没来得及提交的事务做回滚动作。SQL Server要找到所有当前事务修改过的记录,把它们改回原来的状态。所以,如果一个DELETE、INSERT或UPDATE已经运行了一个小时,可能回滚也需要一个小时。回滚过程中,阻塞还会延续,我们只能等待。
有些用户可能等不及,直接重启SQL Server。当SQL Server关闭的时候,回滚动作会被中断,SQL Server会被很快关掉,但是这个回滚动作在下次SQL Server重启的时候会重新开始(数据库做恢复的时候)。重启的时候如果回滚不能很快结束,整个数据库都不可用,可能会带来更严重的后果。
解决方法:
最好的方法是在工作时间尽量不要做这种大的修改操作。这些操作尽量安排在半夜或者周末的时间完成。如果操作已经做了很久,最好耐心等它做完。如果一定要在有工作负荷的时候做,最好把一个大操作分成若干小操作分步完成。
https://docs.microsoft.com/zh-cn/sql/2014-toc/sql-server-transaction-locking-and-row-versioning-guide?view=sql-server-2014#Row_versioning
https://www.cnblogs.com/cnsym/p/3230589.html
12. Windows日志主要有哪几种,SQLServer错误日志一般保留几个,什么情况下会产生新的SQL日志;数据库日志恢复模式有哪几种,区别是什么;数据库日志突然变得很大,而且你无法收缩,可能的原因是什么,怎么查找原因,分别将如何处理;
应用程序日志、安全日志、setup日志、系统日志、Forwarded Events(事件查看器中可以看到)
SQL Server错误日志文件数量默认为7个:1个正在用的(ERRORLOG)和6个归档的(ERRORLOG.1 – ERRORLOG.6),可以配置以保留更多(最多99个)
SQL Server Agent错误日志文件数量共为10个:1个正在用的(SQLAGENT.OUT),9个归档的(SQLAGENT.1 - SQLAGENT.9),个数不可以修改,但可以配置日志所记载的信息类型:信息、警告、错误
https://www.cnblogs.com/seusoftware/p/3926674.html
Full模式的旧称叫”Checkpoint without truncate log“,也就是SQL Server不主动截断log,只有备份log之后,才可以截断log,否则log文件会一直增大,直到撑爆硬盘,因此需要部署一个job定时备份log。Full的好处是可以做point-in-time恢复,最大限度的保证数据不丢失,一般用于critical的业务环境里。缺点就是DBA需要维护log,增加人员成本(其实也就是多了定时备份log这项工作而已)。
Simple模式的旧称叫”Checkpoint with truncate log“,其实这个名字更形象,在Simple模式下,SQL Server会在每次checkpoint或backup之后自动截断log,也就是丢弃所有的inactive log records,仅保留用于实例启动时自动发生的instance recovery所需的少量log,这样做的好处是log文件非常小,不需要DBA去维护,但坏处也是显而易见的,一旦数据库出现异常,需要恢复时,最多只能恢复到上一次的备份,无法恢复到最近可用状态,因为log丢失了。
Bulk-logged模式和full模式类似,唯一的不同是针对以下Bulk操作,会产生尽量少的log:
1) Bulk load operations (bcp and BULK INSERT).
2) SELECT INTO.
3) Create/drop/rebuild index
众所周知,通常bulk操作会产生大量的log,对SQL Server的性能有较大影响,bulk-logged模式的作用就在于降低这种性能影响,并防止log文件过分增长,但是它的问题是无法point-in-time恢复到包含bulk-logged record的这段时间。 Bulk-logged模式的最佳实践方案是在做bulk操作之前切换到bulk-logged,在bulk操作结束之后马上切换回full模式
查找日志空间不重用原因:
SELECT name ,recovery_model_desc ,log_reuse_wait_desc FROM sys.databases WHERE name = '库名'
查询日志的使用空间:
DBCC SQLPERF(LOGSPACE);
可能原因及对应解决方法
原因名 |
解释 |
解决方法 |
NOTHING |
当前有一个或多个可重复使用的虚拟日志文件 |
正常,不需处理 |
CHECKPOINT |
自上次日志截断之后,尚未出现检查点,或者日志头部尚未跨一个虚拟日志文件移动(所有恢复模式)。类似oracle的active状态redolog。 |
这是日志截断延迟的常见原因,一般正常,不需处理
|
LOG_BACKUP |
需要日志备份,以将日志的头部前移(仅适用于完整恢复模式或大容量日志恢复模式) |
完成日志备份后,日志的头部将前移,一些日志空间可能变为可重复使用 |
ACTIVE_BACKUP_OR_RESTORE |
数据备份或还原正在进行(所有恢复模式)时,将阻止截断。 |
一般正常,但需要检查备份日志时间是否过长 |
ACTIVE_TRANSACTION |
事务处于活动状态,一个长时间运行或者未提交的事务可能存在于日志备份的开头。
事务被延迟。“延迟的事务”是有效的活动事务,因为某些资源不可用,其回滚受阻 |
检查最老的活动事务(最久未提交) DBCC OPENTRAN GO select st.text,t2.* from sys.dm_exec_sessions as t2,sys.dm_exec_connections as t1 cross apply sys.dm_exec_sql_text(t1.most_recent_sql_handle) as st where t1.session_id=t2.session_id and t1.session_id>50 |
DATABASE_MIRRORING |
数据库镜像暂停,或者在高性能模式下,镜像数据库明显滞后于主体数据库(仅限于完整恢复模式) |
检查数据同步问题 |
REPLICATION |
在事务复制过程中,与发布相关的事务仍未传递到分发数据库(仅限于完整恢复模式)。 |
给标有replication 的数据库任意一个表创建事务复制,然后删除,再执行收缩(这是数据库的一个BUG) |
DATABASE_SNAPSHOT_CREATION |
正在创建数据库快照(所有恢复模式) |
这是日志截断延迟的常见原因,通常也是主要原因,一般不需处理 |
LOG_SCAN |
正在进行日志扫描(所有恢复模式) |
这是日志截断延迟的常见原因,通常也是主要原因 |
http://www.voidcn.com/article/p-xsvycoea-zh.html
http://www.cnblogs.com/datazhang/p/5238677.html
13. 分区表和分区视图是什么概念,一般是在什么情况下使用,有啥好处;
分区表
分区表是在SQL SERVER2005之后的版本引入的特性。它把逻辑上的一个表在物理上分为很多部分。
而对于SQL SERVER2005之前版本,所谓的分区表类似分区视图,也就是多个表做union操作。
适用情况及优点:
https://docs.microsoft.com/en-us/sql/relational-databases/partitions/partitioned-tables-and-indexes?view=sql-server-2017
https://www.cnblogs.com/CareySon/archive/2011/12/30/2307766.html
分区视图
该视图将所有成员表的SELECT组合为一个使用UNION ALL运算符的结果集。这些成员表的结构相同,作为多个表存储在同一个 SQL Server实例或存储在称为联合数据库服务器的自主 SQL Server 服务器实例组中。
适用情况及优点:
最大的好处是提升性能及免费。表分区仅在Enterprise SQL Server Edition中可用,许可成本昂贵。幸运的是,SQL Server允许您设计自己的分区解决方案,而无需将当前的SQL Server实例升级到Enterprise Edition。这个新选项称为分区视图。虽然这个新解决方案不如表分区灵活,但如果您正确设计,分区视图将为您提供良好的结果。您可以手动设计将用作分区的表,并使用分区视图中的UNION ALL运算符将其组合在一起,该运算符将像表分区一样工作。
https://www.sqlshack.com/sql-server-partitioned-views/
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-view-transact-sql?view=sql-server-2017#partitioned-views
14. 如何比较两个同结构的表数据的差异;如果表损坏了,如何修复;如何在备份文件有问题的情况下尽量还原数据;如何将一个表的Identity属性归零;
① 如何比较两个同结构的表数据的差异
EXCEPT是指在第一个集合中存在,但是不存在于第二个集合中的数据
select * from t1 EXCEPT select * from t2
select * from t2 EXCEPT select * from t1
比较两张表里的内容的checksum值是否一致,但是这种方法只局限于两表结构一摸一样
SELECT SUM(CHECKSUM(*)) AS checksumvalue FROM [dbo].[t1_old]
SELECT SUM(CHECKSUM(*)) AS checksumvalue FROM [dbo].[t1_new]
https://www.cnblogs.com/lyhabc/p/4176269.html
https://blog.csdn.net/tjvictor/article/details/5346024
② 如果表损坏了,如何修复
dbcc checkdb(‘dbname’)
checktable
③ 如何在备份文件有问题的情况下尽量还原数据
RESTORE DATABASE TESTDB FROM DISK='D:\temp\TESTDB_BAD.bak'
WITH CONTINUE_AFTER_ERROR
加CONTINUE_AFTER_ERROR, 虽然备份文件受损,但是会尽最大可能来继续恢复,显示恢复完成
https://blog.csdn.net/snowfoxmonitor/article/details/49612897
④ 如何将一个表的Identity属性归零;
truncate table 表名
当前值设置为new_reseed_value。如果自创建表后没有将行插入该表,则在执行DBCC CHECKIDENT后插入的第一行将使用new_reseed_value作为标识。否则,下一个插入的行将使用new_reseed_value+1。如果new_reseed_value的值小于标识列中的最大值,以后引用该表时将产生2627号错误信息。
执行语句DBCC CHECKIDENT (''dbo.Person'',RESEED,10)后再添加数据时,ID就会自动从11开始,也就是new_reseed_value+1开始。
该方法不会清空已有数据,操作比较灵活,不仅可以将自增值归零,也适用于删除大量连续行后,重新设置自增值并插入新的数据;或从新的值开始,当然不能和已有的冲突。
https://blog.csdn.net/G1036583997/article/details/17172279
15. CheckPoint、LazyWriter和Eager Write的区别和作用;DDL Trigger 和 DML Trigger的区别和作用;
它们都是脏页写入磁盘的方式,但除此之外基本没有什么相同之处
CheckPoint也就意味着在这个点之前的所有修改都已经保存到了磁盘。CheckPoint会定期发生,将所有缓冲区的脏页写入磁盘,不管脏页中的数据是否已经Commit。CheckPoint不会从缓存中移出脏页,CheckPoint进程的工作只是保证脏页被写入磁盘,并且在页头将缓存中的这个页面标记为干净的页面。
A. 管理SQLServer空闲内存:
B. 协调Windows与SQLServer内存:
通常在BCP、SELECT INTO, WRITETEXT,UPDATETEXT,BULK INSERT等nonlogged操作时发生,为了加快这些操作的速度,EagerWrite会管理数据页的创建和分配,这些操作不会等待所有的页面创建完成后才将内存中的数据写入到页面中,而是以更高的优先级边创建边将缓存中的数据写入页面中,以保证缓冲池有足够的空间来完成这些操作。
https://docs.microsoft.com/en-us/sql/relational-databases/writing-pages?view=sql-server-2017
https://blog.csdn.net/tuzhen007/article/details/39228961
② DDL Trigger 和 DML Trigger的区别和作用
DDL触发器会响应各种DDL事件,某些执行类似DDL操作的系统存储过程也可以触发DDL触发器。
适用场景:
DML触发器是一种特殊类型的存储过程,当发生影响触发器中定义的表或视图的DML事件时,它会自动生效。
DML触发器可用于实施业务规则和保障数据完整性,查询其他表以及包含复杂的Transact-SQL语句。触发器和触发它的语句被视为单个事务,可以从触发器中回滚。如果检测到严重错误(例如,磁盘空间不足),整个事务将自动回滚。
https://docs.microsoft.com/en-us/sql/relational-databases/triggers/dml-triggers?view=sql-server-2017
16. Mirroring 和Logshipping 的区别和使用场景;SQLServer的Mirroring与Oracle的哪像技术比较接近,它们的区别是啥;
日志传送主要是通过最基本的数据库事务日志备份和还原任务,来保持两台或多台机器间数据库同步。以此来实现数据冗余,灾难恢复的目的。但主从库间一定会有时间差,而且可能较长,故障切换也较麻烦。
17. Mirroring的搭建步骤,Mirroring三种模式的区别,Mirroring 中同步和异步的原理和要求,搭建Mirroring后,需要对数据库日志做什么处理;
18. Replication配置和使用场景;Replication有哪几种模式;PUSH和PULL有啥区别;搭建Replication后会产生一个什么库;报错时用什么来查看报错的具体语句,清理掉某个库的Replication使用什么语句,查看同步链信息主要通过哪些表;
19. Replication发布端的表能truncate吗,为什么;Replication Identity列如何处理、缺失字段错误如何处理、主键冲突错误如何处理、如何跳过指定的错误、订阅端表被删除了如何处理、大规模改动数据如何处理;某条同步链因为其中的某个表一次性改动数据很大造成同步链的严重延时,要求尽快恢复同步链,如何处理。
20. SSB(Service Broker)使用场景,如何创建,都会创建些什么对象,有啥优缺点,主要通过什么方式实现不同服务器之间的消息传递;可以通过哪些方式排错;
Service Broker是SQL Server自带的消息队列机制,通过Service Broker可以实现数据实例与实例间的通讯,同时也可以作为数据库实例与应用程序的消息传递机制。同时,Service Broker是队列机制实现的,可以保证消息的执行顺序,对于具有事务性要求的数据同步,Service Broker将是很理想的一个数据同步实现。对于需要异步执行处理的应用程序或需要跨多个计算机分发处理的应用程序,Service Broker 会非常有用。
Service Broker 的典型使用包括:
创建消息类型(Message Type),创建消息规则(Contract),队列(Queue)以及服务(Server)
SQL Server Service Broker为SQL Server数据库引擎中的消息传递和排队应用程序提供本机支持。这使开发人员可以更轻松地创建使用数据库引擎组件在不同数据库之间进行通信的复杂应用程序;构建分布式且可靠的应用程序;可以跨多个数据库分发数据工作负载,这减少了开发和测试工作还可以提高性能。Service Broker确保在事务环境中管理所有任务,以确保可靠性和技术一致性。
21. 跟踪数据库数据的变更有哪些方法,它们使用上有何优缺点;
SQL Server记录数据变更有四种方法:触发器、Output子句、变更数据捕获(CDC)功能、同步更改跟踪。其中后两个为SQL Server 2008所新增。
SQL Server 2008 引入了两项跟踪功能,以使应用程序能够确定对数据库中的用户表所做的 DML 更改(插入、更新和删除操作)。 在这些功能出现之前,必须在应用程序中实现自定义跟踪机制。 这些自定义机制通常要求对跟踪的表进行架构更改,或者使用触发器。 变更数据捕获和更改跟踪均不要求在源中进行任何架构更改或使用触发器。
常用方法 |
特点&用法 |
优点 |
缺点 |
CDC(Change Data Capture) |
CDC通过对事务日志的异步读取,记录DML操作的发生时间、类型和实际影响的数据变化,然后将这些数据记录到启用CDC时自动创建的表中。 |
通过cdc相关的存储过程,可以获取详细的数据变化情况。由于数据变化是异步读取的,因此对整体性能的影响不大,远小于通过Trigger实现的数据变化记录。 |
与CT相比,响应时间较长、负载也较高 |
CT(Change Tracking) |
Change Tracking仅记录DML操作的发生时间、类型和影响到的字段,不包含具体的变化数值。客户端通过传递上次同步的版本号来获取从上次同步到现在的变化记录。 |
对于不需要历史信息的那些应用程序,更改跟踪产生的存储开销要小得多,因为它不需要捕获更改的数据。 它使用同步跟踪机制来跟踪更改。 此功能旨在最大限度地减少 DML 操作开销。 |
与变更数据捕获相比,更改跟踪可以解答的历史问题比较有限(因为它仅捕获更改了表行这一事实,但不会捕获更改的数据) |
触发器 |
DML触发器是一种特殊类型的存储过程,当发生影响触发器中定义的表或视图的DML事件时,它会自动生效。
|
这在数据量较小的情况下往往是有效的方式之一,其中After Trigger只能跟踪表的三个操作中的任意组合,而Instead Of trigger可以处理表和视图的更新 |
难以实现复杂功能,不易维护并且通常带来较高的性能开销。 |
Output子句 |
返回受 INSERT、UPDATE、DELETE 或 MERGE 语句影响的各行中的信息,或返回基于受这些语句影响的各行的表达式。 这些结果可以返回到处理应用程序、插入表或表变量。 另外,您可以捕获嵌入的 INSERT、UPDATE、DELETE 或 MERGE 语句中 OUTPUT 子句的结果,然后将这些结果插入目标表或视图 |
与触发器相比,OutPut子句可以直接处理Merge语句 |
同样功能有限,SQL Server 并不保证由使用 OUTPUT 子句的 DML 语句处理和返回行的顺序。 |
https://docs.microsoft.com/zh-cn/sql/relational-databases/track-changes/about-change-data-capture-sql-server?view=sql-server-2017
https://www.cnblogs.com/gaizai/p/3482579.html
https://www.cnblogs.com/gaizai/p/3479731.html
http://www.cnblogs.com/downmoon/archive/2012/04/10/2439462.html
22. SQL调优步骤,如何来判断SQL语句存在问题,怎么定位问题,如何解决这些问题;Nested Join、Merge Join和Hash Join的区别;
23. 数据库故障排查步骤,如何处理紧急数据库问题;
24. 如何考虑和制定数据库备份计划;公司要求对一个非常大的数据库或者表做备份,而且要求数据量尽可能少丢失,你可能会采用什么方法;
25. 如果要你做数据库监控,你会关注那些指标(包括SQLServer和Windows),如何制定性能基线,你使用过哪些监控软件;
26. 数据库迁移步骤;重建一套比较大的测试系统(最少10个数据库实例),如果原来DB数据量都不大,但DB比较多,新搭建的系统数据都不需要,如何快速实现;
停机打快照???
https://www.cnblogs.com/gaizai/archive/2011/03/30/2000175.html
27. 创建Cluster 简要步骤,最少需要几个IP,需要安装些什么服务,需要哪些固定的磁盘,Raid如何设置,磁盘如何划分;SQLServer Cluster与Mysql Cluster 和 Oracle RAC的区别等;
28. 如果遇到一个性能不理想、代码复杂的存储过程,很难通过数据库方面的调优来解决问题,你如何说服开发人员修改它(可能开发人员并不愿意修改);
29. 你有没有遇到过因为你的误操作造成系统故障发生的情况,你当时是如何处理的;如果没有,假定你误删了一个重要的表,你该如何处理;
30. 你准备成为一名什么样的DBA,为此你将如何准备(或者你有怎样的职业规划,准备怎样度过你的DBA生涯);如果你进入公司,你最想获得的是什么。
加强版
1. 谈谈聚集索引、非聚集索引、Hash索引的区别和各自的优劣,Include覆盖索引的作用,相对于组合索引的优势;
2. 日志文件是什么结构,数据写入日志文件与数据文件区别是什么,如何优化日志文件;
Sqlserver对于日志记录是按照严格的顺序写入的,即使有多个日志文件,sqlserver在同一时间点也只写其中一个。只有这个写满了,sqlserver才会写入另外一个
Sqlserver会按照同一个文件组里所有文件现有空闲空间的大小,按这个比例把新的数据分布到所有有空间的数据文件里。如果某个文件写满了,sqlserver会写到其他有空间的文件里
https://docs.microsoft.com/zh-cn/sql/relational-databases/logs/manage-the-size-of-the-transaction-log-file?view=sql-server-2017#Recommendations
3. SQLServer有哪些情况会读或者写日志文件;
4. 描述下CheckPoint、DBCC CheckDB、CheckSum的过程和作用;
5. 数据库文件的组织结构,主要包含哪些页,各自的作用是什么;
6. 如何寻找热点库、热点表和执行最频繁的SQL,以及资源消耗最多的SQL;
7. 内存为什么对SQLServer很重要,SQLServer缓存有哪些类型和各自的作用是什么,内存数据通过哪些方式写入磁盘,一般有哪些调整和控制内存的方法;
8. TempDB容易遇到哪些问题,你是如何配置和使用TempDB使其保持高效和可控的;
9. 对跨服务器访问数据,你有哪些方式,各自有优劣是什么;
10. 谈谈一条Update语句从应用端到数据库端返回结果的整个过程;
11.以SQLServer 2016为例,企业版和标准版的主要区别,企业版的数据库能还原到标准版吗,2016能还原到2012吗,32位机器上的数据库能直接附加或者还原到64位数据库上吗,说说原因;
https://docs.microsoft.com/zh-cn/sql/sql-server/editions-and-components-of-sql-server-2016?view=sql-server-2017
不能直接还原,微软的软件设计方案基本上都是新版本兼容旧版本,旧版本不兼容新版本。
可以设置兼容性使用脚本迁移
https://blog.csdn.net/DBA_Huangzj/article/details/7952403
https://www.cnblogs.com/wangfuyou/p/5777244.html
可以
可以使用 sp_attach_db 系统存储过程或 sp_attach_single_file_db 系统存储过程,或者使用SQL Server Management Studio中的备份和还原功能以及 SQL Server 导入和导出向导。您可以在 SQL Server 的 32 位和 64 位两种版本之间来回移动数据库。
12. 一台SQLServer服务器,你最常调整的配置有哪些,说说它们各自的作用;
排序规则:类似于实例级字符集
最大并行度 (MAXDOP) :控制用于在并行计划中执行查询的的处理器数。
并行的开销阈值(cost threshold for parallelism):仅当运行同一查询的串行计划的估计开销高于在“并行的开销阈值”中设置的值时, SQL Server 才创建和运行该查询的并行计划。 成本指的是在特定硬件配置中运行串行计划估计需要花费的成本。 可设置为 0 到 32767 之间的任何值。 默认值为 5。
USE AdventureWorks2012 ;
GO
EXEC sp_configure 'show advanced options', 1 ;
GO
RECONFIGURE
GO
EXEC sp_configure 'cost threshold for parallelism', 10 ;
GO
RECONFIGURE
GO
最大内存使用量
13. 说说你对SQLServer突然出现CPU很高情况可能的紧急处理措施和后续的排查步骤;
检查数据库用户连接数是否正常,是否有阻塞,是否是语句执行导致cpu高
若有阻塞,按前面阻塞处理方法操作;若是单条语句执行慢,看能否进行简单优化;如果不能,联系开发暂停执行该语句,后续排期优化;
若是并行度太高导致cpu高,联系开发降低并行度,调整最大并行度。
14. windows日志报告数据库文件自动增长时间超过15s的错误,你怎么来分析这个问题,有哪些应对方案;
可能每次需要增长的空间过大,此时需要查看数据文件增量,改为按固定大小增长而不要按百分比
可能存储系统存在故障或者不稳定造成的,联系存储工程师共同排查
https://www.cnblogs.com/wy123/p/6984885.html
15. 谈谈你遇到过的Mirror/replication问题,怎么解决的,哪些因素会影响他们的性能;
16. 如果你想说明一台数据库服务器存在内存瓶颈,哪些指标和哪些方式是你判断的依据;
17. 数据库检测出现损坏,谈谈你可能的修复方式和步骤;
18. 某天你收到一台平时运行很正常的数据库报警,发现很多指标都升高了一倍以上,你怎么快速分析和定位可能的问题;
19. 你遇到过哪些典型的SQL性能问题,怎么发现和处理的;
20. 谈谈你在应对数据量很大、访问频率很高的表时,可能采取的方案,实际做过哪些方案,比较有价值的地方是;
21. 谈谈你对分区表、分表、分库的适用场景、解决的问题和可能带来的问题的看法;
22. 描述下你现在采取的备份、还原方案,RPO、RTO情况,分析下可能存在的问题;
23. 谈谈一台数据库服务器上的所有数据(包括帐号、JOB等)迁移到另一台新服务器所有可能的方法和步骤,描述各自的优缺点;
24. 你会为数据库做哪些基础性的维护工作,说说你做这些的作用;
25. 如果现有的SQLServer服务器数量和访问量翻10倍,你有哪些应对措施;
26. 在维护数据库时,你经常使用的工具有哪些,它们各自的作用,还有哪些操作你觉得做成工具能大幅度提高你的工作效率,你为数据库运维自动化做了哪些工作;
27. 就Windows和SQLServer本身而言,你认为那些方面会影响数据库的性能,有哪些应对措施;
28. 你怎么来评估数据库的环境,怎么预测目前数据库可以提供多长时间的使用,基于那些情况来制定采购计划;
29. 你通过哪些方式来不断的提高自己的数据库运维能力,哪些方面是使你不断向前的动力;
30. 作为一名资深的DBA,你如何带领和培养新人,使ta能快速成长。