1. 程式人生 > 其它 >sql server 一些較常用的操作命令

sql server 一些較常用的操作命令

use master;
restore database 111111
from disk='d:\111111-20160929.bak' --c:\a.bak是備份檔名
with move '111111' to 'd:\111111\111111.mdf' --將111111恢復到檔案d:\111111\111111.mdf
,move '111111_log' to 'd:\111111\111111_log.ldf' , --將111111_log恢復到檔案d:\111111\111111\111111.ldf
NOUNLOAD, REPLACE, STATS = 10
GO

--RESTORE FILELISTONLY FROM DISK = N'd:\111111-20160929.bak'


=======================================================

檢視備份檔案中的資訊(DB的邏輯檔名)
restore filelistonly from disk='E:\CustomsGrab_backup_2021_05_14_010000_5783410.bak'
=================================================================================
PS:普通正常DB還原命令:

RESTORE DATABASE [222222] FROM
DISK = N'e:/222222-20131202.bak' WITH FILE = 1,
NOUNLOAD, REPLACE, STATS = 10
GO

==================================================================================
kill程序佔用的DB
USE master
go
DECLARE @Sql NVARCHAR(max)
SET @Sql=''
select @Sql=@Sql+'kill '+cast(spid as varchar(50))+';' from sys.sysprocesses where dbid=DB_ID('資料庫名稱')
EXEC(@Sql)

離線DB
alter database [BaiInfoBase] set Offline with ROLLBACK IMMEDIATE

查詢程序資訊PID等
EXEC sp_who2;
殺掉PID程序
KILL <SPID>;


RESTORE database BaiInfoBase with norecovery
=================================================================
無法刪除作業,約束衝突,解決方案:
--開啟SQL查詢,
use msdb
select * from sysmaintplan_plans --檢視作業ID
delete from dbo.sysmaintplan_log where plan_id = 'C0A996D6-3A11-4E6C-A814-BB91B0ACBDAF'
delete from sysmaintplan_subplans where plan_id = 'C0A996D6-3A11-4E6C-A814-BB91B0ACBDAF'
DELETE FROM sysmaintplan_plans WHERE [ID]= 'C0A996D6-3A11-4E6C-A814-BB91B0ACBDAF'
--然後再到SQL SERVER 代理-----作業----即可刪除

=================================================================
命令匯入大量SQL資料:
sqlcmd -s localhost -U sa -P bai0323* -d CustomsGrab -i D:\IE_Customs_Record20200316.sql


sqlcmd -S localhost -U username -P password -d dbname -i db.sql
1
sqlcmd 執行檔案 -S localhost 伺服器地址 -U username 使用者名稱 -P password 密碼 -d dbname 資料庫名稱 -i db.sql 要匯入的sql檔案

==============================================================
SELECT TOP 10
[session_id],
[request_id],
[start_time] AS '開始時間',
[status] AS '狀態',
[command] AS '命令',
dest.[text] AS 'sql語句',
DB_NAME([database_id]) AS '資料庫名',
[blocking_session_id] AS '正在阻塞其他會話的會話ID',
[wait_type] AS '等待資源型別',
[wait_time] AS '等待時間',
[wait_resource] AS '等待的資源',
[reads] AS '物理讀次數',
[writes] AS '寫次數',
[logical_reads] AS '邏輯讀次數',
[row_count] AS '返回結果行數'
FROM sys.[dm_exec_requests] AS der
CROSS APPLY
sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
WHERE [session_id]>50 AND DB_NAME(der.[database_id])='BaiInfoERP'
ORDER BY [cpu_time] DESC

========================================================================

--當前的資料庫使用者連線
USE master
GO
--如果要指定資料庫就把註釋去掉
SELECT * FROM sys.[sysprocesses] WHERE [spid]>50 AND DB_NAME([dbid])='BaiInfoERP'
SELECT COUNT(*) FROM [sys].[dm_exec_sessions] WHERE [session_id]>50


==============================================================

--建立連結伺服器
exec sp_addlinkedserver 'Srv2','','SQLOLEDB','192.168.21.30'
exec sp_addlinkedsrvlogin 'Srv2','false',null,'sa','123'
go


===============================================================

清理資料庫日誌

USE [master]
GO
ALTER DATABASE InformationSrv SET RECOVERY SIMPLE WITH NO_WAIT
GO
ALTER DATABASE InformationSrv SET RECOVERY SIMPLE
GO
USE InformationSrv
GO
DBCC SHRINKFILE (N'InformationSrv_log' , 0,TRUNCATEONLY)
GO
USE [master]
GO
ALTER DATABASE InformationSrv SET RECOVERY FULL WITH NO_WAIT
GO
ALTER DATABASE InformationSrv SET RECOVERY FULL
GO

--上面的“資料庫日誌檔名稱”用下面SQL的查詢結果
--查詢指定資料庫的日誌檔名稱
USE InformationSrv
GO
SELECT name FROM SYS.database_files WHERE type_desc='LOG'

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

USE [master]
GO
ALTER DATABASE [資料庫名] SET RECOVERY SIMPLE WITH NO_WAIT
GO
ALTER DATABASE [資料庫名] SET RECOVERY SIMPLE
GO
USE [資料庫名]
GO
DBCC SHRINKFILE (N'[資料庫日誌檔名稱]' , 0,TRUNCATEONLY)
GO
USE [master]
GO
ALTER DATABASE [資料庫名] SET RECOVERY FULL WITH NO_WAIT
GO
ALTER DATABASE [資料庫名] SET RECOVERY FULL
GO

--上面的“資料庫日誌檔名稱”用下面SQL的查詢結果
--查詢指定資料庫的日誌檔名稱
USE [資料庫名]
GO
SELECT name FROM SYS.database_files WHERE type_desc='LOG'

============================================================

建立查詢 , 提示目錄名無效

在目錄:C:\Documents and Settings\Administrator\Local Settings\Temp 下, 建立目錄名稱為1, 如果1存在建立目錄名稱為2.


===============================================================

MSSQL從TXT或CSV源還原資料

1、使用查詢語句獲取資料,例“SELECT * FROM [InformationSrv].[dbo].[Tb_PriceList] where PriceDate>='2021-08-01'”,查詢結果儲存成txt或csv格式檔案。
2、還原:DB-右鍵-匯入資料-選擇平面檔案源(高階-寬度500要選足夠)-選擇目標db-選擇源表和源檢視(編輯對映-勾選啟用標識插入)-開始執行

===============================================================

查詢附加資料庫的進度

EXEC sp_who2; #檢視程序相應的PID

SELECT
session_id, request_id, start_time, status, command
, percent_complete, estimated_completion_time,wait_time, cpu_time, total_elapsed_time, scheduler_id
,sql_handle
--,statement_start_offset, statement_end_offset, plan_handle
, database_id, user_id --,connection_id
, blocking_session_id
, wait_type, last_wait_type, wait_resource, open_transaction_count, open_resultset_count, transaction_id
--, context_info
--, task_address
, reads, writes, logical_reads
--, text_size, language, date_format, date_first, quoted_identifier, arithabort, ansi_null_dflt_on, ansi_defaults, ansi_warnings, ansi_padding, ansi_nulls, concat_null_yields_null, transaction_isolation_level, lock_timeout, deadlock_priority, row_count, prev_error, nest_level, granted_query_memory, executing_managed_code, group_id, query_hash, query_plan_hash
FROM sys.dm_exec_requests WHERE session_id=56
(最後的session_id修改成查詢到的PID,執行後process_percent、percent_complete值為進度百分比)

======================================================================

檢視被鎖表:
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
from sys.dm_tran_locks where resource_type='OBJECT'
(註釋:spid 鎖表程序 ,tableName 被鎖表名)

解鎖:
declare @spid int
Set @spid = 244 --鎖表程序spid
declare @sql varchar(1000)
set @sql='kill '+cast(@spid as varchar)
exec(@sql)

查詢程序資訊SPID等:
EXEC sp_who2;
========================================================================

檢視最慢的sql:
SELECT TOP 5 total_worker_time, last_worker_time,
max_worker_time, min_worker_time,
SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END
- qs.statement_start_offset)/2) + 1) as statement_text
FROM sys.dm_exec_query_stats as qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as st
ORDER BY max_worker_time DESC
==============================================================================