MSSQL varie: differenze tra le versioni

Da Emigar.
Jump to navigation Jump to search
Nessun oggetto della modifica
 
(11 versioni intermedie di uno stesso utente non sono mostrate)
Riga 2: Riga 2:


==ricalcolo statistiche per database==
==ricalcolo statistiche per database==
use miudb
use MioDB
go
go
EXEC sp_updatestats;
EXEC sp_updatestats;
go
go





==Elenco files e spazio occupato==
==Elenco files e spazio occupato==
Riga 36: Riga 33:


==spostamento datafiles==
==spostamento datafiles==
===metodo detach attach===
Metti offline il database
ALTER DATABASE MioDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
EXEC sp_detach_db 'MioDB';
GO

Copia o sposta i file verso il nuovo percorso.

Riattacca il database:
CREATE DATABASE MioDB
ON
(
FILENAME='/nuovo_storage/MioDB.mdf'
),
(
FILENAME='/nuovo_storage/MioDB_log.ldf'
)
FOR ATTACH;
GO

===metodo rename file===
* elencare files e percorsi:
SELECT name,physical_name,state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'MioDB');
* Mettere offline il database:
ALTER DATABASE MioDb SET OFFLINE;
GO
Se serve forzare transazioni in corso:
ALTER DATABASE MioDB SET OFFLINE WITH ROLLBACK IMMEDIATE;
GO
* Spostare o copiare i datafile
mv /vecchio_percorso/miodb01.mdf /nuovo_percorso/
mv /vecchio_percorso/miodb01_log.ldf /nuovo_percorso/
* rinominare i files nel DB
ALTER DATABASE MioDB MODIFY FILE (NAME = MioDB_DATA, FILENAME = '/nuovo_percorso/miodb01.mdf');
GO
ALTER DATABASE MioDB MODIFY FILE (NAME = MioDB_LOG, FILENAME = '/nuovo_percorso/miodb01_log.ldf');
GO
* rimettere online il DB
ALTER DATABASE MioDB SET ONLINE;
GO
===metodo online===
* aggiungi un nuovo file
ALTER DATABASE NomeDatabase
ADD FILE (
NAME = 'NomeNuovoFile',
FILENAME = 'D:\NuovoPercorso\NomeNuovoFile.ndf',
SIZE = 100MB,
FILEGROWTH = 100MB
);
* sposta i dati tutti nel nuovo file
DBCC SHRINKFILE ('NomeVecchioFile', EMPTYFILE);
* rimuovi il vecchio file
ALTER DATABASE NomeDatabase REMOVE FILE NomeVecchioFile;


==sessioni bloccate==
==sessioni bloccate==
Riga 70: Riga 123:
WHERE s.is_user_process = 1 -- Filtra solo i processi utente (esclude quelli di sistema)
WHERE s.is_user_process = 1 -- Filtra solo i processi utente (esclude quelli di sistema)
ORDER BY s.session_id;
ORDER BY s.session_id;
</pre>


<pre>
SELECT
r.session_id,
r.status,
r.wait_type,
r.wait_time,
r.blocking_session_id,
r.cpu_time,
r.total_elapsed_time / 1000 AS elapsed_seconds,
t.text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.status = 'suspended'
ORDER BY r.total_elapsed_time DESC;
</pre>

==sessione che usa il tempdb==
<pre>
SELECT
s.session_id,
s.login_name,
s.host_name,
s.program_name,
r.status,
r.command,
(su.user_objects_alloc_page_count
+ su.internal_objects_alloc_page_count) * 8 / 1024 AS TempDB_MB,
st.text
FROM sys.dm_db_session_space_usage su
JOIN sys.dm_exec_sessions s
ON su.session_id = s.session_id
LEFT JOIN sys.dm_exec_requests r
ON s.session_id = r.session_id
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) st
WHERE s.session_id > 50
ORDER BY TempDB_MB DESC;
</pre>
</pre>



Versione attuale delle 12:14, 18 giu 2026


ricalcolo statistiche per database

use MioDB
go
EXEC sp_updatestats;
go

Elenco files e spazio occupato

SELECT 
   d.name AS DatabaseName,
   f.name AS LogicalFileName,
   f.physical_name AS PhysicalFilePath,
   f.type_desc AS FileType,
   cast(f.size*8.0/1024.0 as float) mb,
   f.max_size,
   f.growth
FROM 
   sys.master_files AS f
INNER JOIN 
   sys.databases AS d ON f.database_id = d.database_id
   order by f.type_desc,f.size;


select type_desc,cast(sum(size)*(8.0/1024) as float) as mb,count(*) as num from sys.master_files group by type_desc


shrink datafiles e log

spostamento datafiles

metodo detach attach

Metti offline il database

ALTER DATABASE MioDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
EXEC sp_detach_db 'MioDB';
GO

Copia o sposta i file verso il nuovo percorso.

Riattacca il database:

CREATE DATABASE MioDB
ON
(
   FILENAME='/nuovo_storage/MioDB.mdf'
),
(
   FILENAME='/nuovo_storage/MioDB_log.ldf'
)
FOR ATTACH;
GO

metodo rename file

  • elencare files e percorsi:
SELECT name,physical_name,state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'MioDB');
  • Mettere offline il database:
ALTER DATABASE MioDb SET OFFLINE;
GO

Se serve forzare transazioni in corso:

ALTER DATABASE MioDB SET OFFLINE WITH ROLLBACK IMMEDIATE;
GO
  • Spostare o copiare i datafile
mv /vecchio_percorso/miodb01.mdf /nuovo_percorso/
mv /vecchio_percorso/miodb01_log.ldf /nuovo_percorso/
  • rinominare i files nel DB
ALTER DATABASE MioDB MODIFY FILE (NAME = MioDB_DATA, FILENAME = '/nuovo_percorso/miodb01.mdf');
GO
 ALTER DATABASE MioDB MODIFY FILE (NAME = MioDB_LOG, FILENAME = '/nuovo_percorso/miodb01_log.ldf');
GO
  • rimettere online il DB
ALTER DATABASE MioDB  SET ONLINE;
GO

metodo online

  • aggiungi un nuovo file
ALTER DATABASE NomeDatabase 
ADD FILE ( 
   NAME = 'NomeNuovoFile', 
   FILENAME = 'D:\NuovoPercorso\NomeNuovoFile.ndf', 
   SIZE = 100MB, 
   FILEGROWTH = 100MB 
);
  • sposta i dati tutti nel nuovo file
DBCC SHRINKFILE ('NomeVecchioFile', EMPTYFILE);
  • rimuovi il vecchio file
ALTER DATABASE NomeDatabase REMOVE FILE NomeVecchioFile;

sessioni bloccate

SELECT 
   r.session_id AS [Sessione Bloccata],
   r.blocking_session_id AS [ID Bloccante],
   t.text AS [Query Bloccante],
   w.wait_type AS [Tipo di Attesa],
   w.wait_duration_ms AS [Durata Attesa (ms)]
FROM sys.dm_exec_requests r
JOIN sys.dm_os_waiting_tasks w ON r.session_id = w.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.blocking_session_id <> 0;


SELECT 
    s.session_id,
    s.login_name,
    s.host_name,
    s.program_name,
    s.status AS session_status,
    r.start_time,
    r.total_elapsed_time,
    r.wait_type,
    r.blocking_session_id,
    st.text AS query_text
FROM sys.dm_exec_sessions AS s
LEFT JOIN sys.dm_exec_requests AS r ON s.session_id = r.session_id
LEFT JOIN sys.dm_exec_connections AS c ON s.session_id = c.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st
WHERE s.is_user_process = 1 -- Filtra solo i processi utente (esclude quelli di sistema)
ORDER BY s.session_id;


SELECT 
    r.session_id,
    r.status,
    r.wait_type,
    r.wait_time,
    r.blocking_session_id,
    r.cpu_time,
    r.total_elapsed_time / 1000 AS elapsed_seconds,
    t.text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.status = 'suspended'
ORDER BY r.total_elapsed_time DESC;

sessione che usa il tempdb

SELECT
    s.session_id,
    s.login_name,
    s.host_name,
    s.program_name,
    r.status,
    r.command,
    (su.user_objects_alloc_page_count
     + su.internal_objects_alloc_page_count) * 8 / 1024 AS TempDB_MB,
    st.text
FROM sys.dm_db_session_space_usage su
JOIN sys.dm_exec_sessions s
    ON su.session_id = s.session_id
LEFT JOIN sys.dm_exec_requests r
    ON s.session_id = r.session_id
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) st
WHERE s.session_id > 50
ORDER BY TempDB_MB DESC;