notebook/IT/SQL/FormationSQL.md
2021-04-20 23:13:14 +02:00

782 lines
20 KiB
Markdown

# formation SQL SERVER
<!-- @import "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} -->
<!-- code_chunk_output -->
- [formation SQL SERVER](#formation-sql-server)
- [Vocabulaire](#vocabulaire)
- [historique de SQL server](#historique-de-sql-server)
- [Particularité de SQL Server](#particularité-de-sql-server)
- [nature des SGBDR](#nature-des-sgbdr)
- [conception de Codd](#conception-de-codd)
- [relation](#relation)
- [attributs](#attributs)
- [atomicité](#atomicité)
- [algébre relationell](#algébre-relationell)
- [migration de base](#migration-de-base)
- [instaltion/Configuration](#instaltionconfiguration)
- [patch](#patch)
- [choix immuable lors de l'instalation](#choix-immuable-lors-de-linstalation)
- [different service](#different-service)
- [instance](#instance)
- [configuration minimal](#configuration-minimal)
- [configuration Base](#configuration-base)
- [base system](#base-system)
- [renomer un serveur SQL](#renomer-un-serveur-sql)
- [outils](#outils)
- [SQLcmd.exe](#sqlcmdexe)
- [table d'admin](#table-dadmin)
- [sys.object](#sysobject)
- [table instance](#table-instance)
- [table base](#table-base)
- [stockage](#stockage)
- [groupe de fichier](#groupe-de-fichier)
- [definition de fichier](#definition-de-fichier)
- [planification de capacité](#planification-de-capacité)
- [disque](#disque)
- [SSD](#ssd)
- [machine virtuel](#machine-virtuel)
- [reduction de fichier](#reduction-de-fichier)
- [transaction](#transaction)
- [partitionnement](#partitionnement)
- [Type](#type)
- [Collonne calculée](#collonne-calculée)
- [Snapshot](#snapshot)
- [import export](#import-export)
- [Bulk INSERT](#bulk-insert)
- [SSIS](#ssis)
- [Schema SQL](#schema-sql)
- [Securité](#securité)
- [compte connexion](#compte-connexion)
- [Utilisateur SQL](#utilisateur-sql)
- [privilége](#privilége)
- [roles](#roles)
- [chifrement](#chifrement)
- [Tache d'administratrion](#tache-dadministratrion)
- [agent SQL](#agent-sql)
- [Database Mail](#database-mail)
- [Travaux](#travaux)
- [monitoring](#monitoring)
- [disque](#disque-1)
- [transaction](#transaction-1)
- [cache](#cache)
- [DBCC](#dbcc)
- [integrité des bases](#integrité-des-bases)
- [réparation base endommagée](#réparation-base-endommagée)
- [index](#index)
- [Sauvegarde](#sauvegarde)
- [mode de récupération](#mode-de-récupération)
- [syntaxe de commande](#syntaxe-de-commande)
- [Urgence](#urgence)
- [multifichier](#multifichier)
- [compresioon](#compresioon)
- [lire une sauvegarde](#lire-une-sauvegarde)
- [surveillance et performance](#surveillance-et-performance)
- [Historisation des données](#historisation-des-données)
- [verrouillages et blocages](#verrouillages-et-blocages)
<!-- /code_chunk_output -->
[benchmark professionnelle](http://www.tpc.org/information/benchmarks.asp)
## Vocabulaire
- SGBD:Système de gestion de base de données
- page: unité de stockage minimal de 8ko
- schema SQL: unité de stockage logique conteneur d'objet relationnelle (dbo est un schema) = namespace
- extention: block de 8 pages = 64ko
- lobs: large object
GO: séparateur de batch qui s'adresse au client il execute les requéte d'avant pour être sur que la requête c'est bien éxecuter
over():
## historique de SQL server
1974: ingres
1984: sybase (premier SGBD client serveur)
1988: accord sysbase/microsoft
1989: sortie de SQL server Unix
1993: rupture avec sysbase sortie de la premiére version de SQL server full windows
1999: version 7 premiére version professionnelle
2005: refonte monté en gamme
2012: SQL server devient plus performant que oracle
## Particularité de SQL Server
- information Schema: select * from information_Schema.Tables -> permet d'avoir la liste des tables
- multischema: chaque base peu contenire un nombre indeterminé de schema
- posibilité de requéter des base sur le meme serveur (oracle postgress foive utilisé un dblink)
- chaque base dispose son journal de transaction (oracle postgress un journal pour tous)
- transaction: lot de commande
- In Memory: plus d'écriture dans le journal de transaction (a utilisé en mode hight availlibility)
- strecht table: stockage de table dans le cloud
## nature des SGBDR
## conception de Codd
- Séparation HArdware/logique
- algébre relationelle
- insersion supression modification emsembliste (peut mettre a jour plusieur donné dans une seule requête)
### relation
- posséde un nom
- possésde une collection d'attributs
- posséde une clef primaire
- peut posséder d'autre clefs
- valeur atomique
- **pas de relation sans clef primaire**
### attributs
- non unique au sein de la relation
- **pas de null**
- fait partie d'un domaine (valeur possible de l'attribut)
### atomicité
donnée atomique: ne peut pas être subdiviser sans perte de sens
en base de donné il faut stockés les donnés au maximum de facon atomique (exemple un numéro de sécurité social est divisable en plusieurs informations)
## algébre relationell
**pas de jointure dans le where**
ordre d'exécution des requétes: *from,where,group by,having,select,orderby*
## migration de base
- de 7 a 2000
- 2000 a 2005 ou 2008
- 2005 - now
## instaltion/Configuration
- classement: french point de code binaire
- authent: mode mix
- **formatage du disque en cluster de 64KO pour s'aligner sur la taille de l'unité d'extention**
- pas de raid 5 6 faut mieux se limiter au raid 0 1 10
- **pas d'outil instalé sur le serveur**
### patch
- <2016 attendre la demande de microsft
- \>2016 faire au plus vite
### choix immuable lors de l'instalation
- répertoire des exe
- répertoire base systeme
- collation de base
### different service
- SQL server Broswer: permet de naviger dans les instance par non au lieux de port (recommandé de désactiver sur la prod)
- gérée les service via SQL Server Configuration Manager
### instance
- port 1433 si une seul instance
- **Ne jamais redemmarrer une instance sauf absolue neccesité**
#### configuration minimal
- max server memory
- cost threshold for parallelism -> cout pour que le moteur étudie le paralémlisme ->min 12 sur PC perso, 25 et 100 sur prod
- max degree of parrallelism -> nombre maximum de thread parralléle recommandation sur grosse machine 1/4 des coeur -1 sur du transactionnelle, plus sur du decissionelle
- optimize for ad hoc workloads:1
- Backup compression default:1 gain sur la vitesse de compression cpu vs vitesse écriture disque sauf si base sont setter en 'transparente data encryption' (chiffrage des fichier de la base)
- Backup checksum default',1
### configuration Base
**ne jamais mettre en ON:**
- AUTO_CLOSE
- AUTO_SHRINK
**mettre a ON:**
- AUTO_CREATE_STATISTICS
- AUTO_UPDATE_STATISTICS
- pour version entreprise: AUTO_UPDATE_STATISTICS_ASYNC
activé l'autonomie partielle pemet de créer des compte user dédiéet de réglé des probléme de collation
```SQL
ALTER DATABASE [DB_GRAND_HOTEL] SET CONTAINMENT = PARTIAL WITH NO_WAIT
```
### base system
**visible:**
- master: liste des bases,connexions,lessage d'erreur (a sauvegarder impérativement tous les jour)
- model: template pour création des basrs
- msdb: gestion des travaux SQL SERVER (a sauvegarder impérativement tous les jour)
- tempdb: objet temporaire
**invisible:**
- mssqlsystemresource: routine systéme
**optionel:**
- ditribution (réplication)
- semanticdb (recherche sémantique)
### renomer un serveur SQL
- renomer le serveur au niveau de windows
- changer le nom dans master
```SQL
select * from sys.servers
exec sp_dropserver ''
exec sp_addserver '', local
```
- redemmarré le service
## outils
- SQL server Management Studio (ne pas utilisé sur une instance deffectueuse)
- SentryONe Plan Explorer (add on permetant d'améliorer le plan d'éxécution des requête)
- Gestionnaire de configuration SQL Server
- apexlog visualisation de log
### SQLcmd.exe
utilitaire en ligne de commande
option:
- *-S* nom du serveur
- *-U" login
- *-P* MDP
- *-E* Sécurité intégré windows
- *-q* tamponne unse requéte (go pour lancer)
- *-Q* lance une requête
- *-A* mode DAC (Dedicated Administrative Connector) connection d'urgence permet de mobiliser les resource pour la connection a utiliser en local
## table d'admin
### sys.object
- contient tous les objet de la base
- *is_ms_shipped* permet de voir les objet system
### table instance
- sys.servers
- sys.databases
- sys.master_files
- sys.configuration
### table base
- sys.table
- sys.schema
- sys.database_files
- sys.indexes
- sys.index_column
- sys.stats
## stockage
considérer les fichier comme si s'était des disque d'OS
deux fichier:
- mdf fichier de donnée (Master Data File)
- ldf journal de transaction (Log Data File)
### groupe de fichier
possibilité de cré diferent group de fichier pour la même base par example
mettre les collonnes purement relationelle dans un group dans un groupe de fichier X
mettre les donné de type blob dans un groupe de fichier spécifique
### definition de fichier
name
filename
Size
MaxSize
Filegrowth
- les taille sont exprimé en KB,MB,GB
- pas de croisance en pourcentage.
### planification de capacité
- journale de transaction 20% des donnée pour les grosse base,40% pour les petitte
- ne pas placez les table ddans le groupe primary
- creer un groupe de fichier blob
- créer plusieur fichier par groupe de fichier en fonction de disques physique
### disque
- raid 0 ou 1 uniquement
#### SSD
optmisation des écriture necesaire **need disk write intensive**
#### machine virtuel
vaux mieux utiliser le stockage non virtuel
non recommandé pour utilisation particuliére
#### reduction de fichier
DBCC SHRINKFILE
options:
- EMPTYFILE: permet de vider le fichier (besoin d'un autre fichier dans le groupfile pour transférer les donnés)
### transaction
aficher le journal de transaction
`select * from sys.fn_dblog(null, null)`
fichier de transaction est le plus sensible a la vitesse d'écriture
3 mode de journalisation:
- Full: journalisation max, aucune purge
- BULK logged: journalisation min, aucune purge
- Simple: journalisation min, purge auto
les deux premier necesitte des savegarde transactionelle pour purger
dans base transactionelle utilisé le mode full
dans les base decisionnelle BI plutot simple
frequence de sauvegarde du journal de transaction:20 a 30 min
si JT plein passez en mode simple.
` alter database [toto] set recovery simple `
### partitionnement
permet de diminuer ou ventiler la plage es données scrutées:
- les recherches
- les mises a jour (prallélisme)
1 création des espace de stockage
2 creation de la fonction de partitionnement
create PArtition Function PF_Date_facture (Datetime2(0))
```SQL
AS RANGE Right
For values ('2018-01-01','2019-01-01','2020-01-01');
```
3 création du schema de répartition
```SQL
Create PARTITION SCHEME PS_DATE FACTURE
as PARTITION PF_DATE_FACTURE
to (FG_OLD,FG_2018,FG2019,FG2020)
```
**on ne peut pas avoir une table stocker sous forme de cluster et partitioner pour cela il
faut supprimer le cluster et recréer un cluster sur la partition**
4 création de l'objet sur la partition
```SQL
create table (...)
ON PS_DATE_FACTURE (coll_critere)
create INDEX (...)
ON PS_DATE_FACTURE (coll_critere)
```
## Type
litteraux: *char,varchar,nchar,nvarchar*
Numérique: *int,smallint,bigint,tinyint,decimal,numeric,float,real*
time: *datetime(obsolete),**datetime2**,time,datetimeoffset*
Binaire: *bit,binary,varbinary,hierarchyID,uniqueindetifier*
Lobs:
- CLOB => varchar(max)
- NCLOB => NVARCHAR(max)
- BLOB => VARBINARY(max), XML, GEOGRAPHY, GEOMETRY
## Collonne calculée
## Snapshot
limité édition enterprise
photographie de la base de données (assimilé a un journal de trasaction inversé).
a utilisé pour les grosse base avec un serveur qui tien la route car le serveur doit mettre a jour le snapshot a chaque modification de la base.
## import export
### Bulk INSERT
- CHECK_CONSTRAINTS: verifie les contraintes Check et FK
- FIRE_TRIGGER: execute les déclencheur
- KEEPIDENTITY: force la valeur dans les auto increments
- KEEPNULLS: collonnes vides transformées en NULL
- BATCHSIZE: spécifie la taille du lot de données
- KILOBYTES_PER_BATCH: Découpe le lot par volume
- ROWS_PER_BATCH: Découpe le lot par ligne
### SSIS
## Schema SQL
Espace de stockage des objet relationelle
- schema par default de la base: dbo
deux niveaux:
- un schema par default est attribuer a un utilisateur
- un schema par default de la base
creation
```SQL
create schema nom_schema
Authorization = nom_utilisateur
```
transfert
```SQL
Alter SCHEMA nom_schema
TRANSFER nom_objet
```
delete
```SQL
DROP SCHEMA nom_Schema
```
## Securité
### compte connexion
create SQL login :
```SQL
create LOGIN CNX_SQL_LAMBDA WITH PASSWORD = 'AZERT123'
```
create WIndows login :
```SQL
create LOGIN CNX_SQL_LAMBDA From windows
with DEFAULT_DATABASE=toto,DEFAULT_LANGUAGE= us_english
```
### Utilisateur SQL
Utilisateur SQL autonome
deux cas:
- utilisateur sans compte de connexion
- utilisateur se conenctant directement a la base
pour le dernier cas la base doit être paramétrée en *contained*
```SQL
ALTER DATABASE [DB_GRAND_HOTEL] SET CONTAINMENT = PARTIAL WITH NO_WAIT
```
### privilége
afficher priovilége
```SQL
select * FROM sys.fn_builtin_permissions(null)
ORDER BY parent_class_desc,covering_permission_name, class_desc
```
```SQL
GRANT <liste de privilèges>
ON <objet a privilégier>
to <liste des entité bénéficiaire>
DENY EXECUTE
ON SCHEMA::[dbo]
TO [USR_ECRIVAIN]
```
### roles
permet de presetter des proviléges
sysadmin,bulkadmin,dbcreator,setupadmin,securityadmin,serveradmin
metadonné:
sys.server_principals
sys.server_permissions
role predefinit de database: db_owner,db_datareader,db_datawriter,db_denydatareader,db_denydatawriter,db_securityadmin,db_accessadmin,db_ddladmin,db_backupoperator
public: roles de base que tous les utilisateur on
revoir les fonction de sécurité sur le diapo
## chifrement
revoir les fonction de sécurité sur le diapo
## Tache d'administratrion
### agent SQL
planificateur de tache associé a SQL SERVER.
les donnée de l'agent sont stockés dans la base msdb.
on y trouve des jog et des alerte
#### Database Mail
permet d'envoyer des mail par le biais du moteur SQL
### Travaux
ensemble d'étape a réaliser
s'execute par default sur le compte de service de l'agent
sur le compte de Service SQL server pour les Transactions
pour les extention de droit on doit utiliser un "proxy"
### monitoring
#### disque
saturation disque
taux de remplisage des fichier de bases
drossisement des fichier SQL des bases
activité IO de disque
#### transaction
longue transaction
blocages
verrou mortels
#### cache
rémanence des pages en cache
taux de mise en cache
### DBCC
DAtabase console Command
utilitaire permettant
- obtenir des informations
- modifier le comportement du moteur
- effectuer la maintenance bas nivaux
#### integrité des bases
- CHECKALLOC
- CHECKCATALOG
- CHECKTABLE
- CHECKFILEGROUP
- CHECKDB
- CHECKCONSTRAINTS
#### réparation base endommagée
lire le diagnostique mais
- ne pas ce précipitez sur la commandes REPAIR
- Commencez par revoir le support (disque)
- Déplacer la base si besoin
- si l'objet endommagé est un index non clustered, supprimez et recréez
- si c'est une table vous pouvez peut être récupérer les pages endommagées (RESTORE PAGE)
si repair_allow_DATA_LOSS est utilisé:
- vérifier les contraintes (notamment FK) sur les tables réparées (checkconstraint)
- supprimez les lignes orpheline a l'aide de requéte (semi aniti joiture left)
- désactiver préalablement les contraints FK
## index
- Primary Key création index cluster par default
- foreign key: ne neccesite pas tous le temps un index
structure de donnée redondante pour acccélérer certaine recherche
relationelle:
- B-tree+
- hash
- BW-Tree
Analyptique
- ColumnStore
PArticuler
- XML
- GEO
- full TEXT
les index B-tree peut être utilisé par
- =
- < > >=>=
- Between
- LIKE 'blalal%'
- Group By
- Order by
2 type d'index:
- clustered table triée par la cled d'index (un par table comme il represente la table)
- NONCLUSTERED: index avec copie des données
ce dernior neccesite un renvoie pour retrouver la ligne originelle de la table
- par un row ID (si pas de index clustered)
- la valeur de la cles clustered
le row ID contien 3 info:
- numéro de fichier dans la base (file_id)
- numéro de page dans le fichier
- numéro de slot de ligne dans la page
les clef d'index clustered devrait:
- être unique
- Not Null
- être la plus petite possible
- ne pas pouvoir être modifié
- toute table doit avoir une clés PRIMAIRE
- la clef Primaire devrait être un collonne IDENTITY
pour voir la fragmentation des index
```SQL
select * from sys.dm_db_index_physical_stats(NULL,NULL,NULL,NULL)
where avg_fragmentation_in_percent > 10 and page_count > 64
```
pour défragmenter
```SQL
alter index .... reorganize -> pas bloquant mais pas top
alter index ..... Rebuild -> bloquant mais pas top (nom bloquant si verzsion entreprise et mode online)
```
## Sauvegarde
consite a dupliquer les données contenu dans un systeme inforamtique de maniére a pouvoir le restaurer
deux conception:
- sauvegarde pour pallier a l'erreur humaine
- sauvegarde pour archivage
3 mode de sauvegarde:
- complet:
- Enregistre l'intéfrité de la base de données a l'huere de fin de la sauvegarde compléte.
- Laisse le journal tel quel.
- initialise les sauvegarde diferentielles et du journal de transaction.
- diferentille: enregistre les pages modifiées depuis la derniére sauvegarde compléte et les transactions qui ont eu lieu pendant la sauvegarde
- journal de transactions: enregistre mes transactions qui ont eu lieu depuis la derniére sauvegarde
### mode de récupération
- full (par default) obligatoire en haute dispo
- bulk logged
- simple
### syntaxe de commande
complete
BAckup DATABASE
differentiel
Backup DATABASE WITH DIFFERENTIAL
transactionelle
BAckup LOG
### Urgence
**COPY_ONLY**: effectue une sauvegarde dans inscription dans le plan de sauvegarde
### multifichier
il est possible d'envoyer la sauvegarde sur plusieur fichier en paralléle chaque ficcier contien une partie de la sauvegarde
il est aussi possible d'envoyer la sauvegarde sur diferent device
### compresioon
WITH COMPRESSION
gain sur le temps de sauvegarde
gain important sur le temps de restauration
gain importants sur le volume
### lire une sauvegarde
RESTORE LABELONLY: donne des info sur lr média de sauvegarde
RESTORE HEADERONLY: liste les fichier de sauvgarde dans le média
RESTORE FILELISTONLY list les fichier restaurable pour l'in des sauvegarde contenue
RESTORE VERIFYONLY: controle la sauvegarde
## surveillance et performance
### Historisation des données
Tables temporelles:
- Table Temporalisée: une table de production dont on rajoute 2 collonnes techniques qui peuvent être "hidden" et qui sont alimentées automatiquement a chaque insert update
- table d'historisation: table technique contenant l'historique des évolution de chacune des lignes de la table a laquelle elle est associée.
l'intervalle de temps est ouvert a droite fermée a gauche
interrogation temporelle
- as-of
- from
- between
- contained in
- all
### verrouillages et blocages
mode de verrouillage pessimiste par default
- une écriture bloque la lecture et l'écriture d'autre processus
- le verrouillafe peut entrainner des: wait,Blocage,deadlock