Duplication rapide de bases de données avec le nouveau paramètre skip_alloc des commandes disk init et disk resize de Sybase ASE 15.0.2

Introduction

Une saisie un peu rapide, une faute de syntaxe et la commande disk init retourne une erreur et son usage. Là, surprise en regardant la syntaxe proposée, un nouveau paramètre skip_alloc dans la commande disk init est proposé.

Ce paramètre skip_alloc n'est pas encore dans les manuels mais figure dans les pages "Changed commands" du manuel des nouvelles fonctionnalités de Sybase Adaptive Server Enterprise 15.0.2 (BOL). La commande disk resize propose également ce nouveau paramètre skip_alloc avec la version 15.0.2.

L'option skip_alloc évite l'initialisation des pages de données réalisée dans le cadre de la création d'un device avec disk init. Elle est supportée pour tous les systèmes de fichiers excepté les systèmes de fichiers Windows NTFS. Pour Windows, seuls les systèmes de fichiers NT de type Raw sont supportés.

Le document suivant va montrer un usage intéressant de ce paramètre, qui associé à la commande "create database for load" permet une duplication très rapide de base.

La nouvelle option skip_alloc de la commande disk init

disk init
Must give parameters for 'DISK INIT' command. 
Usage: DISK INIT
        NAME="<name>", 
        PHYSNAME="<device>", 
        VDEVNO=<devnumber>,
        SIZE=<size> 
        [,CNTRLTYPE=<controller>] 
        [,VSTART=<offset>]
        [,CONTIGUOUS] 
        [,DSYNC={TRUE|FALSE}] 
        [,DIRECTIO={TRUE|FALSE}]
        [,SKIP_ALLOC={TRUE|FALSE}]

Cette nouvelle option skip_alloc est également disponible avec la commande disk resize.

Benchmark de duplication de bases de données : scénario

Objectifs du benchmark

Les temps de création d'une base de données d'une dizaine de Go sont mesurés suivant 2 stratégies :

  • Méthode classique : disk init, create database, load database
  • Méthode rapide : disk init avec l'option skip_alloc, create database avec l'option for load, load database.

Le résultat est connu d'avance puisqu'en mode rapide, deux étapes d'initialisation des pages vides sont évitées (disk init + create database). L'objectif est de savoir dans quelles proportions.

Méthode classique

disk init name='data_01', physname='/test/data_01.dat', size='1000M'
go
disk init name='log_01', physname='/test/log_01.dat', size='100M'
go
create database test on data_01=1000 log on log_01=100
go
load database test from '/dump/test.dmp'
go
online database test
go

Le fichier de log du serveur ASE montre l'initialisation des pages lors de l'exécution de la commande disk init :

tail -f $LOG/$DSQUERY.log
01:00000:00075:2010/01/31 12:31:04.06 kernel  Virtual device 12 started using asynchronous i/o.
01:00000:00075:2010/01/31 12:31:04.06 kernel  Initializing device /dba/sybase/test/data_01.dat
from offset 0 with zeros.
01:00000:00075:2010/01/31 12:34:13.80 kernel  Finished initialization.
01:00000:00075:2010/01/31 12:36:06.08 kernel  Initializing virtual device 13, '/dba/sybase/test/log_01.dat'
with dsync 'on'.
01:00000:00075:2010/01/31 12:36:06.08 kernel  Virtual device 13 started using asynchronous i/o.
01:00000:00075:2010/01/31 12:36:06.08 kernel  Initializing device /dba/sybase/test/log_01.dat
from offset 0 with zeros.
01:00000:00075:2010/01/31 12:36:22.90 kernel  Finished initialization.

Méthode rapide avec skip_alloc

disk init name='data_02', physname='/test/data_02.dat', size='1000M'
        , skip_alloc=true
go
disk init name='log_02', physname='/test/log_02.dat', size='100M'
        , skip_alloc=true
go
create database test2 on data_02=1000 log on log_02=100 
        for load
go
load database test2 from '/dump/test.dmp' 
go
online database test
go

Le fichier de log du serveur ASE affiche un avertissement lorsque l'option skip_alloc est utilisée.

Aucun droit à l'erreur dans ce contexte, l'espace disponible dans le système de fichiers pour les futures allocations n'est pas vérifiée : warning: 'disk init' command with 'skip_alloc' option turned on for device "<device>", does not ensure allocation of the specified number of pages.
tail -f $LOG/$DSQUERY.log
00:00000:00075:2010/01/31 13:22:38.91 kernel  Initializing virtual device 12, '/dba/sybase/test/data_01.dat'
with dsync 'on'.
00:00000:00075:2010/01/31 13:22:38.91 kernel  Virtual device 12 started using asynchronous i/o.
00:00000:00075:2010/01/31 13:22:38.91 kernel  warning: 'disk init' command with 'skip_alloc' option turned on
for device "/dba/sybase/test/data_01.dat", does not ensure allocation of the specified number of pages.
00:00000:00075:2010/01/31 13:23:11.87 kernel  Initializing virtual device 13, '/dba/sybase/test/log_01.dat'
with dsync 'on'.
00:00000:00075:2010/01/31 13:23:11.87 kernel  Virtual device 13 started using asynchronous i/o.
00:00000:00075:2010/01/31 13:23:11.87 kernel  warning: 'disk init' command with 'skip_alloc' option turned on
for device "/dba/sybase/test/log_01.dat", does not ensure allocation of the specified number of pages.

Résultats

Commande Temps (s) méthode classique Temps (s) méthode rapide
disk init data 190 1
disk init log 19 1
create database 260 15
load database 220 220
performances disk init create database

Les étapes importantes d'initialisation des pages réalisées avec les commandes "disk init" et "create database" peuvent être omises dans le cadre d'une duplication de base par rechargement. Les durées sont dès lors divisées par 3.