On peut presque dire que sur 90% des instances que l’on audite, les bases systèmes ne sont JAMAIS sauvegardées.
Souvent c’est un aspect de l’administration qui est négligé: on effectue des sauvegardes des bases utilisateurs, mais les bases systèmes ne contiennent pas de données métier donc elles ne font pas partie du plan de maintenance. C’est une erreur qui peut se payer très cher lorsque la base système devient inutilisable.
Dans cet article, nous allons voir comment se sortir de deux cas de corruption de la base master, qui est la clé de voûte de SQL Server:
- Lors du démarrage, le fichier master.mdf n’est pas lisible.
- Lors du démarrage, le fichier master.mdf est lisible mais le recovery sur la base master échoue.
Dans les deux cas, la conséquence est la même: SQL Server ne peut pas démarrer.
Bases système et rôles:
Les bases systèmes sont au nombre de 4 (on ne parle ni de distribution qui est liée à la réplication ni de resource qui n’est pas visible par défaut).
- master: elle contient tous les éléments de configuration et de fonctionnement de l’instance: logins, liste des bases, options de configuration, liste des fichiers, des serveurs liés, endpoints, etc… Sans base master, pas de SQL Server. Donc il faut la sauvegarder.
- msdb: elle contient toutes les informations nécessaires pour que l’agent puisse fonctionner: jobs, alertes, opérateurs, schedules, avec en plus de nombreuses tables d’historique (backupset, backupfile, restorefile, suspect_pages, etc…). Sans base msdb, pas d’agent SQL, pas d’informations statistiques. Donc il faut la sauvegarder.
- model: sert de définition pour toute nouvelle création de base. Nécessaire lors de la séquence de boot de l’instance pour permettre la création de tempdb. Beaucoup diront qu’il n’est pas nécessaire de sauvegarder la base model, et l’argument est discutable: sans base model, pas de base tempdb au démarrage et donc pas de SQL Server. Sans sauvegarde, il faudrait retrouver une base depuis une instance en même version avec la même collation, alors que SQL Server met moins d’une seconde à sauvegarder cette base de 2Mb. Est-ce que ça ne vaut vraiment pas le coup de l’inclure dans le plan de maintenance ?
- tempdb: base servant à stocker temporairement le résultat d’agrégats (tris, regroupements, etc…), le version store, les facts de DBCC CHECKDB, parmi d’autres choses… Cette base est recréée de zéro à chaque redémarrage. Bien que l’issue de sa création soit critique pour la suite de la séquence de démarrage, les données qui s’y trouvent ne le sont pas. De la sorte, il n’est pas nécessaire de la sauvegarder.
Séquence de démarrage de SQL Server:
Pour bien comprendre quoi faire lorsque la base master est endommagée, il faut d’abord détailler la séquence de démarrage de SQL Server. En rouge les phases importantes pour ce qui nous intéresse dans cet article:
Etape 1:
Server Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) Nov 24 2008 13:01:59 ... Server (c) 2005 Microsoft Corporation. Server All rights reserved. Server Server process ID is 168048. Server Authentication mode is MIXED. Server Logging SQL Server messages in file 'C:\UTRECHT\MSSQL.1\MSSQL\LOG\ERRORLOG'. Server This instance of SQL Server last reported using a process ID of 3332 at 21/06/2011 ... Server Registry startup parameters: Server -d C:\UTRECHT\MSSQL.1\MSSQL\DATA\master.mdf Server -e C:\UTRECHT\MSSQL.1\MSSQL\LOG\ERRORLOG Server -l C:\UTRECHT\MSSQL.1\MSSQL\DATA\mastlog.ldf
SQL Server va lire ses informations de démarrage dans la base de registre (sous HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\Parameters):
– Le fichier de données de la base master (-d)
– Le journal de transactions de la base master (-l)
– Le fichier ERRORLOG (-e)
– Éventuellement une liste de traceflags (-T, non indiqué dans cet exemple)
Etape 2:
Serveur SQL Server is starting at normal priority base (=7)... Serveur Detected 2 CPUs. This is an informational message; no user action is required. Serveur Using dynamic lock allocation. Initial allocation of 2500 Lock blocks and 5000 ... Serveur Attempting to initialize Microsoft Distributed Transaction Coordinator (MS DTC) ... Serveur The Microsoft Distributed Transaction Coordinator (MS DTC) service could not be ... Serveur Database mirroring has been enabled on this instance of SQL Server. spid4s Starting up database 'master'. spid4s 6 transactions rolled forward in database 'master' (1) ... spid4s 0 transactions rolled back in database 'master' (1)... spid4s Recovery is writing a checkpoint in database 'master' (1) ...
en 3 sous étapes:
– 2.1 SQL Server ouvre le fichier master.mdf et le journal de transactions.
– 2.2: il exécute un recovery sur la base master.
– 2.3: master est mise en ligne à la fin du recovery.
On note qu’à partir de ce point le thread principal forke un premier fils (spid4s). Le suffixe ‘s‘ apposé au SPID indique qu’il s’agit d’une session système. Une fois la base master en ligne, cette session va demeurer pendant toute la durée d’exécution de SQL Server sous la dénomination ‘SIGNAL HANDLER’. C’est ce thread qui sera chargé d’intercepter ensuite une demande STOP envoyée par le Gestionnaire de Services.
Etape 3:
spid4s SQL Trace ID 1 was started by login "sa". spid4s Starting up database 'mssqlsystemresource'. spid4s The resource database build version is 9.00.4035 ... spid4s Server name is 'UTRECHT'... spid9s Starting up database 'model'. spid9s Clearing tempdb database. spid9s Starting up database 'tempdb'.
SQL Server ouvre la base model, effectue un recovery et créé la base tempdb. Ces actions sont effectuées par une session système différente (spid9s).
Etape 4:
Serveur A self-generated certificate was successfully loaded for encryption. Serveur Server is listening on [ 'any' <ipv6> 1433]. Serveur Server is listening on [ 'any' <ipv4> 1433]. Serveur Server local connection provider is ready to accept connection on ... Serveur Server named pipe provider is ready to accept connection on ... Serveur Server is listening on [ ::1 <ipv6> 1434]. Serveur Server is listening on [ 127.0.0.1 <ipv4> 1434]. Serveur Dedicated admin connection support was established for listening locally on port ... Serveur SQL Server is now ready for client connections... spid12s The Service Broker protocol transport is disabled or not configured. spid12s The Database Mirroring protocol transport is disabled or not configured. spid12s Service Broker manager has started. spid16s Starting up database 'msdb'. spid17s Starting up database 'CAPDATA'. spid18s Starting up database 'FoodMart2005'. spid19s Starting up database 'demorecovery'. spid20s Starting up database 'distribution'.
Enfin dernière étape, les bases utilisateurs sont ouvertes en parallèle et un recovery est exécuté sur chacune d’entre elles. Noter les différents threads système utilisés pour accélérer la mise en ligne.
Il faut savoir que ces étapes de démarrage sont débrayables. On peut indiquer à SQL Server de s’arrêter :
– Soit juste après l’ouverture du fichier master.mdf mais AVANT le début du recovery de master entre les étapes 2.1 et 2.2 (trace flag -T3607)
– Soit juste après le recovery de master, entre les étape 2.3 et 3 (trace flag -T 3608).
Corruption de la base master, quoi faire:
Cas n°1: le fichier master.mdf est illisible:
Lorsqu’un problème survient entre les étapes 2.1 et 2.2, le fichier master.mdf est illisible et ne peut pas être ouvert. Le recovery ne peut pas débuter et l’instance s’arrête:
2011-07-03 15:25:50.27 spid7s Starting up database 'master'. 2011-07-03 15:25:50.30 spid7s Error: 824, Severity: 24, State: 6. 2011-07-03 15:25:50.30 spid7s SQL Server detected a logical consistency-based I/O error: restore pending. It occurred during a read of page (1:0) in database ID 1 at offset 0000000000000000 in file 'E:\MSSQL10.SQL1\MSSQL\DATA\master_corrupted.mdf'. Additional messages in the SQL Server error log or system event log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information, see SQL Server Books Online. 2011-07-03 15:25:50.33 spid7s Error: 5173, Severity: 16, State: 1. 2011-07-03 15:25:50.33 spid7s One or more files do not match the primary file of the database. If you are attempting to attach a database, retry the operation with the correct files. If this is an existing database, the file may be corrupted and should be restored from a backup.
Dans ce cas, c’est l’enveloppe du fichier master.mdf qui est en cause, et on ne peut pas mettre de point d’arrêt avant l’étape 2.1, donc on est obligé de recréer une enveloppe saine pour la base master, que l’on ait un backup ou non.
En version 2005, on était obligé de repartir du DVD d’installation et relancer un setup /wait REINSTALL=SQL_Engine REBUILDDATABASE=1 pour reconstruire toutes les bases système. Donc au passage, si on n’avait pas non plus de sauvegarde de msdb, adieu jobs, opérateurs, alertes…
Depuis la version 2008, fort heureusement, un mini-setup et des templates des bases systèmes se trouvent dans le répertoire de base de SQL Server, et on n’a plus besoin du DVD d’installation:
- Le setup embarqué: c:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\Release\Setup.exe
- Les templates des bases systèmes: sous le répertoire des binaires de l’instance, sous Binn\Templates.
On relance donc une réinstallation des bases systèmes à partir de là:
DOS>setup.exe /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=SQL1 /SQLSYSADMINACCOUNTS=user1 /SAPWD=m0np@$$w0rdS@ /SQLCOLLATION=French_CI_AS Microsoft (R) SQL Server 2008 Setup 10.00.2735.00 Copyright (c) Microsoft Corporation. All rights reserved. DOS>
- /ACTION=REBUILDDATABASE : indique que l’on souhaite reconstruire les bases systèmes.
- /INSTANCE=: est le nom de l’instance à reconstruire, on aurait utilisé MSSQLSERVER s’il avait s’agit d’une instance par défaut.
- /SQLSYSADMINACCOUNTS= : donne le ou les comptes à ajouter au rôle sysadmin lors de la réinstallation, c’est un minimum pour pouvoir ensuite se connecter.
- /SAPWD= : le mot de passe pour le compte SA lorsque l’authentification est MIXED.
- /SQLCOLLATION= : la collation de l’instance.
On peut vérifier la bonne exécution du setup dans le fichier Summary.txt sous ~SetupBootstrap\Log:
Overall summary: Final result: Passed Exit code (Decimal): 0 Exit message: Passed Start time: 2011-07-03 15:50:37 End time: 2011-07-03 15:52:36 Requested action: RebuildDatabase
Puis il faut redémarrer l’instance en mode mono-utilisateur dans une fenêtre DOS:
E:\MSSQL10.SQL1\MSSQL\Binn>sqlservr -m -s SQL1 2011-07-03 15:53:25.63 Server Microsoft SQL Server 2008 (SP1) - 10.0.2757.0 (Intel X86) Jan 8 2010 20:19:57 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition on Windows NT 6.0 <X86> (Build 6001: Service Pack 1) (VM) 2011-07-03 15:53:25.63 Server (c) 2005 Microsoft Corporation. 2011-07-03 15:53:25.63 Server All rights reserved. 2011-07-03 15:53:25.64 Server Server process ID is 952. 2011-07-03 15:53:25.64 Server System Manufacturer: 'VMware, Inc.', System Model: 'VMware Virtual Platform'. 2011-07-03 15:53:25.64 Server Authentication mode is MIXED. 2011-07-03 15:53:25.64 Server Logging SQL Server messages in file 'E:\MSSQL10.SQL1\MSSQL\Log\ERRORLOG'. 2011-07-03 15:53:25.64 Server This instance of SQL Server last reported using a process ID of 816 at 7/3/2011 3:52:34 PM (local) 7/3/2011 1:52:34 PM (UTC). ... 2011-07-03 15:53:25.64 Server Registry startup parameters: -d E:\MSSQL10.SQL1\MSSQL\DATA\master.mdf -e E:\MSSQL10.SQL1\MSSQL\Log\ERRORLOG -l E:\MSSQL10.SQL1\MSSQL\DATA\mastlog.ldf 2011-07-03 15:53:25.64 Server Command Line Startup Parameters: -m -s SQL1 SQL1 2011-07-03 15:53:25.67 Server SQL Server is starting at normal priority base (=7). This is an informational message only... 2011-07-03 15:53:25.67 Server Detected 1 CPUs. This is an informational message; no user action is required. 2011-07-03 15:53:25.70 Server Perfmon counters for resource governor pools and groups failed to initialize and are disabled. 2011-07-03 15:53:25.70 Server Using dynamic lock allocation. Initial allocation of 2500 Lock blocks and 5000 Lock Owner blocks per node... 2011-07-03 15:53:25.82 Server Node configuration: node 0: CPU mask: 0x00000001 Active CPU mask: 0x00000001. This message provides a description of the NUMA configuration for this computer... 2011-07-03 15:53:25.85 Server Database Mirroring Transport is disabled in the endpoint configuration. 2011-07-03 15:53:25.86 spid7s Warning ****************** 2011-07-03 15:53:25.87 spid7s SQL Server started in single-user mode. This an informational message only. No user action is required. 2011-07-03 15:53:25.87 spid7s Starting up database 'master'. 2011-07-03 15:53:25.98 spid7s Recovery is writing a checkpoint in database 'master' (1)... 2011-07-03 15:53:26.05 spid7s SQL Server Audit is starting the audits. This is an informational message. No user action is required. 2011-07-03 15:53:26.05 spid7s SQL Server Audit has started the audits. This is an informational message. No user action is required. 2011-07-03 15:53:26.07 spid7s FILESTREAM: effective level = 0, configured level = 0, file system access share name = 'SQL1'. 2011-07-03 15:53:26.17 spid7s SQL Trace ID 1 was started by login "sa". 2011-07-03 15:53:26.18 spid7s Starting up database 'mssqlsystemresource'. 2011-07-03 15:53:26.22 spid7s The resource database build version is 10.00.2757... 2011-07-03 15:53:26.63 spid9s Starting up database 'model'. 2011-07-03 15:53:26.98 Server A self-generated certificate was successfully loaded for encryption. 2011-07-03 15:53:26.99 spid7s Server name is 'VMSUSER1\SQL1'. This is an informational message only. No user action is required. 2011-07-03 15:53:27.17 Server Server is listening on [ 'any' <ipv6> 49161]. 2011-07-03 15:53:27.21 Server Server is listening on [ 'any' <ipv4> 49161]. 2011-07-03 15:53:27.24 Server Server local connection provider is ready to accept connection on [ \\.\pipe\SQLLocal\SQL1 ]. 2011-07-03 15:53:27.24 Server Server local connection provider is ready to accept connection on [ \\.\pipe\MSSQL$SQL1\sql\query ]. 2011-07-03 15:53:27.28 Server Server is listening on [ ::1 <ipv6> 49162]. 2011-07-03 15:53:27.28 Server Server is listening on [ 127.0.0.1 <ipv4> 49162]. 2011-07-03 15:53:27.28 Server Dedicated admin connection support was established for listening locally on port 49162. 2011-07-03 15:53:27.29 Server The SQL Server Network Interface library could not register the Service Principal Name (SPN) for the SQLServer service... 2011-07-03 15:53:27.30 Server SQL Server is now ready for client connections. This is an informational message; no user action is required. 2011-07-03 15:53:27.36 spid9s Clearing tempdb database. 2011-07-03 15:53:27.38 spid11s A new instance of the full-text filter daemon host process has been successfully started. 2011-07-03 15:53:27.44 spid7s Starting up database 'msdb'. 2011-07-03 15:53:28.04 spid9s Starting up database 'tempdb'. 2011-07-03 15:53:28.23 spid7s Recovery is complete. This is an informational message only. No user action is required.
Dans une seconde fenêtre de commande, se connecter et restaurer le backup :
C:\Users\user1>sqlcmd -E -S .\SQL1 1> restore database master from disk='E:\MSSQL10.SQL1\MSSQL\Backup\master.bak' 2> go Processed 376 pages for database 'master', file 'master' on file 1. Processed 4 pages for database 'master', file 'mastlog' on file 1. The master database has been successfully restored. Shutting down SQL Server. SQL Server is terminating this process.
Quand on est bien rôdé, la restauration ne prend pas plus de cinq minutes. Une fois la base restaurée, SQL Server s’arrête, et il ne reste plus qu’à le redémarrer via net start ou la console Configuration Manager. Et le service est de nouveau en ligne.
Cas n°2: le fichier master.mdf est lisible mais le recovery échoue:
C’est le cas utilisé dans la démo. Lorsqu’un problème survient entre les étapes 2.2 et 2.3, le fichier master.mdf est ouvert et le recovery commence, mais échoue avant d’avoir pu aller au bout. Même conséquence, la base master ne peut être ouverte et l’instance doit s’arrêter:
2011-07-03 16:11:32.98 spid7s Starting up database 'master'. 2011-07-03 16:11:34.89 spid7s Error: 824, Severity: 24, State: 2. 2011-07-03 16:11:34.89 spid7s SQL Server detected a logical consistency-based I/O error: incorrect pageid (expected 1:84; actual 12336:808464432). It occurred during a read of page (1:84) in database ID 1 at offset 0x000000000a8000 in file 'E:\MSSQL10.SQL1\MSSQL\DATA\master_corrupted.mdf'. Additional messages in the SQL Server error log or system event log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information, see SQL Server Books Online. 2011-07-03 16:11:34.94 spid7s Error: 3314, Severity: 21, State: 1. 2011-07-03 16:11:34.94 spid7s During undoing of a logged operation in database 'master', an error occurred at log record ID (196:64:2). Typically, the specific failure is logged previously as an error in the Windows Event Log service. Restore the database or file from a backup, or repair the database. 2011-07-03 16:11:34.94 spid7s Cannot recover the master database. SQL Server is unable to run. Restore master from a full backup, repair it, or rebuild it. For more information about how to rebuild the master database, see SQL Server Books Online.
Contrairement au cas précédent, l’étape d’ouverture de master.mdf est validée donc si on a un backup on peut intercaler un point d’arrêt et dire à SQL Server de stopper la séquence de démarrage juste avant le recovery, en utilisant le traceflag -T3607:
E:\MSSQL10.SQL1\MSSQL\Binn>sqlservr -m -T 3607 -s SQL1 2011-07-03 15:19:21.42 Server Microsoft SQL Server 2008 (SP1) - 10.0.2757.0 (Intel X86) Jan 8 2010 20:19:57 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition on Windows NT 6.0 <X86> (Build 6001: Service Pack 1) (VM) 2011-07-03 15:19:21.47 Server (c) 2005 Microsoft Corporation. 2011-07-03 15:19:21.47 Server All rights reserved. 2011-07-03 15:19:21.48 Server Server process ID is 560. 2011-07-03 15:19:21.48 Server System Manufacturer: 'VMware, Inc.', System Model: 'VMware Virtual Platform'. 2011-07-03 15:19:21.48 Server Authentication mode is MIXED. 2011-07-03 15:19:21.48 Server Logging SQL Server messages in file 'E:\MSSQL10.SQL1\MSSQL\Log\ERRORLOG'. 2011-07-03 15:19:21.53 Server This instance of SQL Server last reported using a process ID of 1996 at 7/2/2011 11:52:16 PM (local) 7/2/ 2011 9:52:16 PM (UTC). This is an informational message only; no user action is required. 2011-07-03 15:19:21.53 Server Registry startup parameters: -d E:\MSSQL10.SQL1\MSSQL\DATA\master_corrupted.mdf -e E:\MSSQL10.SQL1\MSSQL\Log\ERRORLOG -l E:\MSSQL10.SQL1\MSSQL\DATA\mastlog_corrupted.ldf 2011-07-03 15:19:21.54 Server Command Line Startup Parameters: -m -T 3607 3607 -s SQL1 SQL1 2011-07-03 15:19:21.62 Server SQL Server is starting at normal priority base (=7). This is an informational message only. No user action is required. 2011-07-03 15:19:21.62 Server Detected 1 CPUs. This is an informational message; no user action is required. 2011-07-03 15:19:22.18 Server Perfmon counters for resource governor pools and groups failed to initialize and are disabled. 2011-07-03 15:19:22.22 Server Using dynamic lock allocation. Initial allocation of 2500 Lock blocks and 5000 Lock Owner blocks per node. ... 2011-07-03 15:19:23.13 Server Node configuration: node 0: CPU mask: 0x00000001 Active CPU mask: 0x00000001. This message provides a description of the NUMA configuration for this computer. ... 2011-07-03 15:19:23.34 Server Database Mirroring Transport is disabled in the endpoint configuration. 2011-07-03 15:19:23.40 spid7s Warning ****************** 2011-07-03 15:19:23.41 spid7s SQL Server started in single-user mode. This an informational message only. No user action is required. 2011-07-03 15:19:23.41 spid7s Starting without recovery. This is an informational message only. No user action is required. 2011-07-03 15:19:23.56 spid7s Starting up database 'master'. 2011-07-03 15:19:24.99 Server A self-generated certificate was successfully loaded for encryption. 2011-07-03 15:19:25.02 Server Server is listening on [ 'any' <ipv6> 49161]. 2011-07-03 15:19:25.03 Server Server is listening on [ 'any' <ipv4> 49161]. 2011-07-03 15:19:25.05 Server Server local connection provider is ready to accept connection on [ \\.\pipe\SQLLocal\SQL1 ]. 2011-07-03 15:19:25.05 Server Server local connection provider is ready to accept connection on [ \\.\pipe\MSSQL$SQL1\sql\query ]. 2011-07-03 15:19:25.07 Server Server is listening on [ ::1 <ipv6> 49162]. 2011-07-03 15:19:25.08 Server Server is listening on [ 127.0.0.1 <ipv4> 49162]. 2011-07-03 15:19:25.08 Server Dedicated admin connection support was established for listening locally on port 49162. 2011-07-03 15:19:25.12 Server The SQL Server Network Interface library could not register the Service Principal Name (SPN) for the SQL Server service. Error: 0x54b, state: 3. Failure to register an SPN may cause integrated authentication to fall back to NTLM instead of Kerberos... 2011-07-03 15:19:25.13 Server SQL Server is now ready for client connections. This is an informational message; no user action is required.
Ensuite on ouvre un second prompt DOS et on restaure la sauvegarde de master :
C:\Users\user1>sqlcmd -E -S .\SQL1 1> restore database master from disk='E:\MSSQL10.SQL1\MSSQL\Backup\master.bak' 2> go Processed 376 pages for database 'master', file 'master' on file 1. Processed 4 pages for database 'master', file 'mastlog' on file 1. The master database has been successfully restored. Shutting down SQL Server. SQL Server is terminating this process.
Là encore, SQL Server détecte qu’une restauration de la base master vient d’avoir lieu, et stoppe l’instance immédiatement ensuite. Il suffit de redémarrer le service via SQL Configuration Manager et notre application est de nouveau disponible, tout ça en moins de 2 minutes.
Sans backup dans ce cas, il aurait fallu reconstruire une enveloppe de la base master comme dans le cas précédent, puis remettre à jour tous les logins, serveurs liés, options de configuration, patches, endpoints, etc… et enfin rattacher les bases utilisateur.
Conclusion:
La conclusion est simple: sauvegardez vos bases système. Si master se retrouve endommagée, sans backup le temps passé à remonter toutes les informations sera beaucoup plus important, et parfois il ne sera pas possible de tout remonter (les mots de passe des logins par exemple, certaines options de configuration modifiées). Le préjudice peut être très élevé: une interruption intempestive coûte cher à l’entreprise: pénalités financières par rapport aux clients, crise d’image, etc… alors qu’ajouter trois petites bases système dans un plan de maintenance ne vous coûte quasiment rien.
A+. David B.
Continuez votre lecture sur le blog :
- How-To : réduire l’enveloppe de tempdb (David Baffaleuf) [SQL Server]
- Recharger un backup de master en SQL 2014 CU6 (David Baffaleuf) [SQL Server]
- Installer SAP IQ 16.1 en tant que service sur Red Hat 8 (David Baffaleuf) [Sybase]
- Reclusteriser une instance standalone (David Baffaleuf) [SQL Server]
- Haute disponibilité de PostgreSQL avec Patroni (Ludovic AUGEREAU) [PostgreSQL]