SqlServer 2005

Installation

L’installation ce fait via le lancement de l’executable d’installation. Suite à l’installation vous pouvez utiliser le SQL Server Configuration manager

C:\WINDOWS\system32\mmc.exe /32 "C:\WINDOWS\system32\SQLServerManager.msc"

Il faut vérifier qu’il existe bien un service SQLServerAgent Il est possible sur cet outil de paramétrer les services comme la sélection:

  • des utilisateurs qui lancent les services
  • options au démarrage (ajout de -T4616 dans les paramètres de démarrage de MSQLSERVER)

L’outil qui va par la suite beaucoup nous servir est le Microsoft SQL Server Management Studio. Pour pouvoir ce connecter sur une base distante il faut

  • Activez les connexions à distance sur l’instance de SQL Server à laquelle vous voulez vous connecter à partir d’un ordinateur distant.
  • Activez le service SQL Server Browser.
  • Configurez le pare-feu afin d’autoriser le trafic réseau associé à SQL Server et au service SQL Server Browser.

Il existe un excellent article : http://support.microsoft.com/kb/914277/fr. Il faut vérifier

  • Configuration de la surface d’exposition SQL Server (connection locale ou distante)
  • service SQL Server Browser soit activée (gère la méthode de connection au serveur)
  • Création d’exceptions dans le pare-feu Windows (dans le parfeu ajouter une exception pour le programme sqlservr.exe et sqlbrowser.exe)

Cela ne suffit pas il faut encore, la plupart du temps, créer un utilisateur et souvent autoriser le double mode de connection:

  • windows
  • sqlserver

Pour le mode de connection en local ouvrir Microsoft SQL Server Management Studio, ce connecter puis

  • clic droit sur le serveur
  • Sélectionner “Propriétés”,
  • Dans la page “Sécurité”,
  • Sélectionner “Mode d’authentification SQL Server et Windows”
  • Cliquer sur OK.

Pour l’ajout d’un tuilisateur il faut toujours dans Microsoft SQL Server Management Studio sélectionner Serveur/Sécurité/connexion, puis clic droit nouvelle connexion.

Note

sur l’ajout d’une connection il n’y rien de particulier hors mis la sélection du type de connection windows ou sqlserver

la création via interface permet de créer connexion et utilisateur (utilisateur lie connexion à base/schema) On peut aussi faire l’ajout de cet connexion par script sql

create login TEST with password='TESTDB', DEFAULT_DATABASE=master
create user TEST

Création, maintenance, utilisation

On peut tout faire à partir de Microsoft SQL Server Management Studio mais il est souvent plus utile d’utiliser les commandes sql.

Création DB

un clic droit sur base de donnée suffit. Les principaux paramètres à verifier sont:

  • les logs

    • type (data ou log)
    • emplacement
    • accroissement
    • nombre
  • statistique

  • unicode

Exemple en sql pour créer la base DBFRED

USE [master]
GO
CREATE DATABASE [DBFRED] ON  PRIMARY
( NAME = N'DBFRED_Data',
    FILENAME = N'C:\Data\DBFRED_Data.mdf' ,
    SIZE = 88064KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%)
LOG ON
( NAME = N'DBFRED_Log',
    FILENAME = N'C:\Data\DBFRED_Data_log.LDF' ,
    SIZE = 52416KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%)
GO
--niveau de compatibilité
EXEC dbo.sp_dbcmptlevel @dbname=N'DBFRED', @new_cmptlevel=80
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [DBFRED].[dbo].[sp_fulltext_database] @action = 'disable'
end
GO
ALTER DATABASE [DBFRED] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [DBFRED] SET ANSI_NULLS OFF
GO
ALTER DATABASE [DBFRED] SET ANSI_PADDING OFF
GO
ALTER DATABASE [DBFRED] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [DBFRED] SET ARITHABORT OFF
GO
ALTER DATABASE [DBFRED] SET AUTO_CLOSE ON
GO
ALTER DATABASE [DBFRED] SET AUTO_CREATE_STATISTICS ON
GO
ALTER DATABASE [DBFRED] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [DBFRED] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [DBFRED] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [DBFRED] SET CURSOR_DEFAULT  GLOBAL
GO
ALTER DATABASE [DBFRED] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [DBFRED] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [DBFRED] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [DBFRED] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [DBFRED] SET  ENABLE_BROKER
GO
ALTER DATABASE [DBFRED] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [DBFRED] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [DBFRED] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [DBFRED] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [DBFRED] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [DBFRED] SET  READ_WRITE
GO
ALTER DATABASE [DBFRED] SET RECOVERY FULL
GO
ALTER DATABASE [DBFRED] SET  MULTI_USER
GO
ALTER DATABASE [DBFRED] SET PAGE_VERIFY TORN_PAGE_DETECTION
GO
ALTER DATABASE [DBFRED] SET DB_CHAINING OFF

Création de deux tables

CREATE TABLE dbo.Table_1
    (
    id int NOT NULL IDENTITY (1, 1),
    name nchar(10) NULL,
    forname nchar(20) NULL
    )  ON [PRIMARY];

ALTER TABLE dbo.Table_1 ADD CONSTRAINT
    PK_Table_1 PRIMARY KEY CLUSTERED
    (
    id
    ) ON [PRIMARY];

CREATE TABLE dbo.Table_2
    (
    id int NOT NULL IDENTITY (1, 1),
    id2 int NOT NULL,
    lib nchar(20) NULL
    )  ON [PRIMARY];

ALTER TABLE dbo.Table_2 ADD CONSTRAINT
    PK_Table_2 PRIMARY KEY CLUSTERED
    (
    id
    ) ON [PRIMARY];

Note

dans ce code on stipule que cette table sera gérer sur le fichier data [PRIMARY]

on peut donc répartir comme on le souhaite sur un groupe fichier les tables d’une base

chargement de ces tables

insert into dbo.Table_1(name, forname) values('name0','forname0');
insert into dbo.Table_2(id2, lib) values( 0,'lib0');
insert into dbo.Table_1(name, forname) values('name1','forname1');
insert into dbo.Table_2(id2, lib) values( 1,'lib1');
insert into dbo.Table_1(name, forname) values('name2','forname2');
insert into dbo.Table_2(id2, lib) values( 2,'lib2');
insert into dbo.Table_1(name, forname) values('name3','forname3');
insert into dbo.Table_2(id2, lib) values( 3,'lib3');
insert into dbo.Table_1(name, forname) values('name4','forname4');
insert into dbo.Table_2(id2, lib) values( 4,'lib4');
insert into dbo.Table_1(name, forname) values('name5','forname5');
insert into dbo.Table_2(id2, lib) values( 5,'lib5');
insert into dbo.Table_1(name, forname) values('name6','forname6');
insert into dbo.Table_2(id2, lib) values( 6,'lib6');
insert into dbo.Table_1(name, forname) values('name7','forname7');
insert into dbo.Table_2(id2, lib) values( 7,'lib7');
insert into dbo.Table_1(name, forname) values('name8','forname8');
insert into dbo.Table_2(id2, lib) values( 8,'lib8');
insert into dbo.Table_1(name, forname) values('name9','forname9');
insert into dbo.Table_2(id2, lib) values( 9,'lib9');
insert into dbo.Table_1(name, forname) values('name10','forname10');
insert into dbo.Table_2(id2, lib) values( 10,'lib10');
insert into dbo.Table_1(name, forname) values('name11','forname11');
insert into dbo.Table_2(id2, lib) values( 11,'lib11');
insert into dbo.Table_1(name, forname) values('name12','forname12');
insert into dbo.Table_2(id2, lib) values( 12,'lib12');
insert into dbo.Table_1(name, forname) values('name13','forname13');
insert into dbo.Table_2(id2, lib) values( 13,'lib13');
insert into dbo.Table_1(name, forname) values('name14','forname14');
insert into dbo.Table_2(id2, lib) values( 14,'lib14');
insert into dbo.Table_1(name, forname) values('name15','forname15');
insert into dbo.Table_2(id2, lib) values( 15,'lib15');
insert into dbo.Table_1(name, forname) values('name16','forname16');
insert into dbo.Table_2(id2, lib) values( 16,'lib16');
insert into dbo.Table_1(name, forname) values('name17','forname17');
insert into dbo.Table_2(id2, lib) values( 17,'lib17');
insert into dbo.Table_1(name, forname) values('name18','forname18');
insert into dbo.Table_2(id2, lib) values( 18,'lib18');
insert into dbo.Table_1(name, forname) values('name19','forname19');
insert into dbo.Table_2(id2, lib) values( 19,'lib19');

select * from dbo.Table_1;
select * from dbo.Table_2;

Sauvegarde complète

BACKUP DATABASE DBFRED TO DISK='C:\SVG\DBFREDSQL.back'

ajout de nouvelles lignes

insert into dbo.Table_1(name, forname) values('name21','forname21');
insert into dbo.Table_2(id2, lib) values( 21,'lib21');
insert into dbo.Table_1(name, forname) values('name22','forname22');
insert into dbo.Table_2(id2, lib) values( 22,'lib22');
insert into dbo.Table_1(name, forname) values('name23','forname23');
insert into dbo.Table_2(id2, lib) values( 23,'lib23');
insert into dbo.Table_1(name, forname) values('name24','forname24');
insert into dbo.Table_2(id2, lib) values( 24,'lib24');
insert into dbo.Table_1(name, forname) values('name25','forname25');
insert into dbo.Table_2(id2, lib) values( 25,'lib25');
insert into dbo.Table_1(name, forname) values('name26','forname26');
insert into dbo.Table_2(id2, lib) values( 26,'lib26');
insert into dbo.Table_1(name, forname) values('name27','forname27');
insert into dbo.Table_2(id2, lib) values( 27,'lib27');
insert into dbo.Table_1(name, forname) values('name28','forname28');
insert into dbo.Table_2(id2, lib) values( 28,'lib28');
insert into dbo.Table_1(name, forname) values('name29','forname29');
insert into dbo.Table_2(id2, lib) values( 29,'lib29');

création d’un lieu de stockage des diff

exec sp_addumpdevice 'DISK', 'DIFFSQL', 'C:\SVG\DBFREDDIFFSQL.back'

Sauvegarde différentielle

BACKUP DATABASE DBFRED TO DIFFSQL WITH DIFFERENTIAL

ajout de nouvelles lignes

insert into dbo.Table_1(name, forname) values('name31','forname31');
insert into dbo.Table_2(id2, lib) values( 31,'lib31');
insert into dbo.Table_1(name, forname) values('name32','forname32');
insert into dbo.Table_2(id2, lib) values( 32,'lib32');
insert into dbo.Table_1(name, forname) values('name33','forname33');
insert into dbo.Table_2(id2, lib) values( 33,'lib33');
insert into dbo.Table_1(name, forname) values('name34','forname34');
insert into dbo.Table_2(id2, lib) values( 34,'lib34');
insert into dbo.Table_1(name, forname) values('name35','forname35');
insert into dbo.Table_2(id2, lib) values( 35,'lib35');
insert into dbo.Table_1(name, forname) values('name36','forname36');
insert into dbo.Table_2(id2, lib) values( 36,'lib36');
insert into dbo.Table_1(name, forname) values('name37','forname37');
insert into dbo.Table_2(id2, lib) values( 37,'lib37');
insert into dbo.Table_1(name, forname) values('name38','forname38');
insert into dbo.Table_2(id2, lib) values( 38,'lib38');
insert into dbo.Table_1(name, forname) values('name39','forname39');
insert into dbo.Table_2(id2, lib) values( 39,'lib39');

Sauvegarde différentielle

BACKUP DATABASE DBFRED TO DIFFSQL WITH DIFFERENTIAL

ajout de nouvelles lignes

insert into dbo.Table_1(name, forname) values('name41','forname41');
insert into dbo.Table_2(id2, lib) values( 41,'lib41');
insert into dbo.Table_1(name, forname) values('name42','forname42');
insert into dbo.Table_2(id2, lib) values( 42,'lib42');
insert into dbo.Table_1(name, forname) values('name43','forname43');
insert into dbo.Table_2(id2, lib) values( 43,'lib43');
insert into dbo.Table_1(name, forname) values('name44','forname44');
insert into dbo.Table_2(id2, lib) values( 44,'lib44');
insert into dbo.Table_1(name, forname) values('name45','forname45');
insert into dbo.Table_2(id2, lib) values( 45,'lib45');
insert into dbo.Table_1(name, forname) values('name46','forname46');
insert into dbo.Table_2(id2, lib) values( 46,'lib46');
insert into dbo.Table_1(name, forname) values('name47','forname47');
insert into dbo.Table_2(id2, lib) values( 47,'lib47');
insert into dbo.Table_1(name, forname) values('name48','forname48');
insert into dbo.Table_2(id2, lib) values( 48,'lib48');
insert into dbo.Table_1(name, forname) values('name49','forname49');
insert into dbo.Table_2(id2, lib) values( 49,'lib49');

Nous avons donc maintenant au niveau sauvegarde deux fichiers:

  • C:/SVG/DBFREDSQL.bak contient une suavegarde complète
  • C:/SVG/DBFREDDIFFSQL.bak contient 2 sauvegardes partielles

Note

les dernières commandes ne font pas partie pour l’instant de fichier de sauvergarde

Nous allons maintenant simuler une restore de base, pour cela nous alons droper la base Tout d’abord on s’assure que personne ne travaille sur la base puis on sauvegarde les journaux à partir de la base master

ALTER DATABASE DBFRED SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
BACKUP LOG DBFRED TO DIFFSQL;
--destruction base qui ne doit pas être prise en compte (içi dans une connection DBFRED)
ALTER DATABASE DBFRED SET MULTI_USER;
TRUNCATE TABLE dbo.Table_1;

--retour dans la base master
ALTER DATABASE DBFRED SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
--RESTORE DATABASE DBFRED FROM DIFFSQL WITH REPLACE, RECOVERY;
RESTORE DATABASE DBFRED
    FROM DISK = 'C:\SVG\DBFREDSQL.back'
    WITH REPLACE,
    NORECOVERY;
RESTORE DATABASE DBFRED
    FROM DISK = 'C:\SVG\DBFREDDIFFSQL.back'
    WITH REPLACE,
    RECOVERY;
ALTER DATABASE DBFRED SET MULTI_USER;

Warning

Pour pouvoir utilisé les LOG il faut absolument avoir comme modèle de sauvegarde full

Il peut être obtenu vi un alter table: ALTER DATABASE [DBFRED] SET RECOVERY FULL On peut utiliser des différentiels en identifiant clairement le fichier

BACKUP DATABASE DBFRED TO DISK=’C:SVGDBFREDDIFF1SQL.back’ WITH DIFFERENTIAL

Mise en place d’une sauvergarde et d’une restauration .. warning:

Quelques soit la politique de sauvegarde il faut sauvegarder la base master en full régulièrement

Cette base contient toutes les infos sur les autres bases Nous allons partir du principe que nous avons une base DBFRED les commandes de sauvegarde sont des sauvegardes

  • full
  • incrémentale
  • log (juste au moment du crash)

script de sauvegarde

BACKUP DATABASE DBFRED TO DISK='C:\SVG\DBFREDSQL_ALL01.back'
BACKUP DATABASE DBFRED TO DISK='C:\SVG\DBFREDSQL_DIF01.back' WITH DIFFERENTIAL
BACKUP DATABASE DBFRED TO DISK='C:\SVG\DBFREDSQL_DIF02.back' WITH DIFFERENTIAL
BACKUP LOG DBFRED TO DISK='C:\SVG\DBFREDSQL_LOG01.back'

Nous avons donc 4 fichiers de sauvegarde au moment du crash .. figure:: data20100811_57.png

script de restauration executé sur la base master du serveur

ALTER DATABASE DBFRED SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
RESTORE DATABASE DBFRED
    FROM DISK = 'C:\SVG\DBFREDSQL_ALL01.back'
    WITH REPLACE,
    NORECOVERY;
RESTORE DATABASE DBFRED
    FROM DISK = 'C:\SVG\DBFREDSQL_DIF02.back'
    WITH REPLACE,
    NORECOVERY;
RESTORE DATABASE DBFRED
    FROM DISK = 'C:\SVG\DBFREDSQL_DIF02.back'
    WITH REPLACE,
    NORECOVERY;
RESTORE DATABASE DBFRED
    FROM DISK = 'C:\SVG\DBFREDSQL_LOG01.back'
    WITH REPLACE,
    RECOVERY;
ALTER DATABASE DBFRED SET MULTI_USER;

En faite nous utilisons les sauvegardes différentielles à partir d’une sauvegarde complète. Seule la sauvegarde des LOG à l’option RECOVERY permet par la suite à la base d’être utilisable. Si nous n’avons pas de sauvegarde des LOG il est possible d’utiliser cette option sur n’importe qu’elle autre sauvegarde .. figure:: data20100811_58.png

Pour créer automatiquement les sauvegardes vous pouvez utiliser les Travaux.

Les travaux de base pour la sauvegarde peuvent ce décomposer en étape:

  • suppression de l’ancien fichier log

    • si ok aller à l’étape suivante
    • si ko aller à l’étape 3
  • backup (diff ou full) de la base

    • si ok finir le travail en envoyant succès
    • si ko aller à l’étape 3
  • envoi mail erreur

    • si ok finir le travail en envoyant erreur
    • si ko finir le travail en envoyant erreur

Pour l’envoi d’email vous pouvez aller voir le document dans windows , envoi mail

dans les notifications ajouter l’écriture dans le gestionnaire d’évènement windows. .. figure:: data20100811_59.png

Warning

il faudrait aussi trunquer les fichiers log (.ldf) qui sonon grossissent. Il faut pour cela lancer une suite de commande après la sauvegarde de la base

BACKUP LOG [nomDataBAse] WITH TRUNCATE_ONLY
GO
--SHRINKFILE, Réduit la taille physique du fichier.
DBCC SHRINKFILE(logicalName_log, 2)

Note

vous pouvez obtenir le logicalName_log en demandant le script de création de la base

Si le shrink ne fonctionne toujours pas c’est qu’une transaction est toujours en cours. Pour vérifier exécuter un

DBCC OPENTRAN.

et aussi