SQL Server Mirroring

Explication :

Le mirroring est une réplication se basant sur les données modifiées d’une base de données princiaple et envoyée à une secondaire. Le flux tient compte de l’ordre de la transaction, mais aussi des blocs modifiés/à modifier

La création du mirroring se passe en 3 étapes :

  • Création des points de terminaisons
  • Clonage de la base de données
  • Ouverture du flux de mirroring

Tout d’abord, il faut créer des points de terminaisons sur les 2(ou3) instances afin que le flux puisse fonctionner

Principale

CREATE ENDPOINT [Mise en miroir] 
STATE=STARTED
AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
FOR DATA_MIRRORING (ROLE = PARTNER, AUTHENTICATION = WINDOWS NEGOTIATE
, ENCRYPTION = REQUIRED ALGORITHM RC4)
GO

Secondaire

USE [master]
GO
CREATE ENDPOINT [Mise en miroir]
STATE=STARTED
AS TCP (LISTENER_PORT = 5023, LISTENER_IP = ALL)
FOR DATA_MIRRORING (ROLE = PARTNER, AUTHENTICATION = WINDOWS NEGOTIATE
, ENCRYPTION = REQUIRED ALGORITHM RC4)
GO

Sur le témoin

USE [master]
GO
CREATE ENDPOINT [Mise en miroir]
STATE=STARTED
AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
FOR DATA_MIRRORING (ROLE = WITNESS, AUTHENTICATION = WINDOWS NEGOTIATE
, ENCRYPTION = REQUIRED ALGORITHM RC4)
GO

Après la création des points de terminaison, on peut passer au clonage de la base de données

Sur le primaire

ALTER DATABASE [test] SET RECOVERY FULL
 GO
 BACKUP DATABASE [test] TO DISK = N'C:\Microsoft SQL Server\MSSQL14.MASTER\MSSQL\Backup\test.bak' WITH INIT, STATS = 5
 BACKUP LOG [test] TO DISK = N'C:\Microsoft SQL Server\MSSQL14.MASTER\MSSQL\Backup\test.trn' WITH STATS = 5
 GO

Sur le secondaire

RESTORE DATABASE [test] FROM DISK = N'C:\Microsoft SQL Server\MSSQL14.MASTER\MSSQL\Backup\test.bak' WITH NORECOVERY, MOVE N'test' TO N'C:\Program Files\Microsoft SQL Server\MSSQL14.SECOND\MSSQL\DATA\test.mdf',  MOVE N'test_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL14.SECOND\MSSQL\DATA\test_log.ldf', REPLACE

RESTORE LOG [test] FROM DISK = N'C:\Microsoft SQL Server\MSSQL14.MASTER\MSSQL\Backup\test.trn' WITH NORECOVERY
 GO

Ouverture du flux de réplication

Sur le secondaire

ALTER DATABASE [GESTCOM] SET PARTNER = 'TCP://192.168.217.135:5023'
GO

Sur le primaire

ALTER DATABASE [GESTCOM] SET PARTNER = 'TCP://192.168.217.135:5022'
GO
ALTER DATABASE GESTCOM SET WITNESS = 'TCP://WITNESSHOST4:5022'
GO

Plus encore :

Configurer le timeout

SELECT db.name
,dm.mirroring_connection_timeout
FROM sys.database_mirroring AS dm
INNER JOIN sys.databases AS db
ON db.database_id=dm.database_id

Activer le contrôle d’intégrité des pages

SELECT DB_NAME(database_id)
,'ALTER DATABASE '+QUOTENAME(DB_NAME(database_id))+' SET PAGE_VERIFY CHECKSUM '
FROM [sys].[database_mirroring]
WHERE [mirroring_role_desc] IS NOT NUL

Arrêter le mirroir

ALTER DATABASE DB_CHEOPS SET PARTNER OFF

Basculer manuellement une base en miroir :

USE [MASTER]
ALTER DATABASE [DB_CHEOPS] SET PARTNER FAILOVER

Suspendre le miroir

ALTER DATABASE [DB_CHEOPS] SET PARTNER SUSPEND;

ALTER DATABASE [DB_CHEOPS] SET PARTNER RESUME;

Supprimer le témoin

SELECT DB_NAME(database_id)
,'ALTER DATABASE '+QUOTENAME(DB_NAME(database_id))+' SET WITNESS OFF'
FROM [sys].[database_mirroring]
WHERE [mirroring_role_desc] IS NOT NULL

Voir la config du miroir

SELECT DB_NAME(database_id)
,[mirroring_role_desc]
,[mirroring_partner_name]
,[mirroring_partner_instance]
,[mirroring_witness_name]
,[mirroring_witness_state_desc]
,[mirroring_connection_timeout]
FROM [sys].[database_mirroring]
WHERE [mirroring_role_desc] IS NOT NULL

Répliquer les SID utilisateurs sur le nœud secondaire pour que la bascule automatique puisse se faire :

/*** Suppression du login SQL, s'il existe 
IF EXISTS (SELECT * FROM sys.server_principals WHERE name =N'adm-cheops') DROP LOGIN "adm-cheops"
GO
(Re)création du login SQL avec le bon SID ***/
CREATE LOGIN "adm-cheops"
WITH PASSWORD=N'ZKpn3tp@Au',
SID=0xFB0D674081172B40B11775D459FAE8B9, CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
Publicités

Configuration de la rotation des logs

Configuration

Les logs de Oracle doivent être fréquemment switcher afin d’éviter plusieurs phénomènes :

  • lecture impossible car fichier trop lourd
  • lecture impossible car y a trop d’informations
  • écriture ralentit car le fichier est trop lourd

pour ce faire, sur Linux, y a un outils par défaut qui fait très bien le travail : logrotate. (/etc/log/logrotate.conf pour la conf et /etc/log/logrotate.d/ pour les fichiers de conf des applis)

Celui-ci permet de faire des configurations complexes et compatibles avec une problématique de pas mal de soft : le lock du log.

Voici ma config :

alert log
/oracle/diag/rdbms/<sid>/<SID>/trace/alert_<SID>.log {
weekly #rotation sur une semaine
rotate 52 #on gharde 1an
compress #Pour compresser le fichier de log
delaycompress # pour que l'alert -1 ne soit pas compressée
notifempty #pas de log si vide…
missingok
copytruncate #je copie l'alert pour après la compresser et truncate la courante
nocreate
}
listener log
/oracle/product/11.2.0/<INST>/log/diag/tnslsnr/agfa-pacs/listener/trace/listener.log {
weekly
rotate 4
notifempty
missingok
copytruncate
nocreate
}

Références

https://www.admin-linux.fr/memo-logrotate/
http://www.delafond.org/traducmanfr/man/man8/logrotate.8.html

PowerShell tips

PowerShell tips

Tail et cat

Pour voir la fin d’un fichier :
Get-Content <fichier> -Tail ou Get-Content <fichier> -Wait -Tail

Get-Content listener.log -Tail 10000 | Set-Content listener.log2

Pour l’envoyer dans un autre :
Get-Content <fichier> | Set-Content <fichier2>

Get-Content listener.log2 | Set-Content .\listener.log
Affectation mémoires Oracle

Affectation mémoires Oracle

Depuis la 11g, une nouvelle fonctionnalité de gestion automatique de la mémoire est apparue.

Automatic Memory Management

L’AMM permet de tout gérer de manière transaprente dans Oracle (SGA + PGA).
Pour l’activer, il suffit de positionner les paramètres memory_max_target et memory_target.
Pour calculer son affectation : AMM=sga_max_size+pga_agregate_target

Par contre, si vous êtes sur Linux où si vous n’aimez pas qu’on vous assite trop, il est possible de revenir en arrière :

SELECT (
   (SELECT SUM(value) FROM V$SGA) -
   (SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY)
   ) "SGA_TARGET"
FROM DUAL;

Attention, laisser/activer les paramètres pga_agregate_target et sga_target peuvent influencer le comportement de memory_target.
alors, pga_agregate_target = affectation mini de la pga et sga_target=affectation mini de la sga.

références

dba-oracle.com

Configurer un linux

Présentation

A chaque fois qu’on se connecte à un Linux, on constate la même chose… les admins ne connaissent pas leur OS !!!

Action

Swapiness

C’est un paramètre qui défini à quel taux d’utilisation de la RAM on va renvoyer dans la swap afin de privilégier le cache disque !!! Paramètre de merde !!!!
cat /proc/sys/vm/swappiness

  • vm.swappiness = 0 – Linux utilisera le HD en dernière limite pour éviter un manque de RAM.
  • vm.swappiness = 60 – Valeur par défaut de Linux : à partir de 40% d’occupation de Ram, le noyau écrit sur le disque.
  • vm.swappiness = 100 – tous les accès se font en écriture dans la SWAP.

Pour rétablir un bon fonctionnement il faut modifier le fichier /etc/sysctl.conf en root
if [ `grep "vm.swappiness" /etc/sysctl.conf | wc -l` -gt 0 ];
then
VAR=`grep "vm.swappiness" /etc/sysctl.conf`
VALUE=`echo ${VAR} | awk {'print $3'}`
if [ ${VALUE} -gt 10 ]
then
NVAR=`echo $VAR | sed -e "s/${VALUE}/10/g"`
echo ${NVAR}
cp /etc/sysctl.conf /etc/sysctl.conf.`date '+%Y%m%d'`
sed -i -e "s/${VAR}/${NVAR}/g" /etc/sysctl.conf
else
echo ${VAR}
fi
else
echo vm.swappiness = 10 > /etc/sysctl.conf
fi

Pour l’activer avant le prochain démarrage
sysctl vm.swappiness=10

HugePages

Par défaut, Linux stocke les pages mémoires en bloc de 4ko, et gère ces pages avec la swap en mode LRU.
C’est pas pour Oracle ça !
Voir si les HP sont utilisées grep Huge /proc/meminfo
Pour calculer leur taille, utiliser le script de Mr Oracle (à mettre dans un script):
#!/bin/bash
#
# hugepages_settings.sh
#
# Linux bash script to compute values for the
# recommended HugePages/HugeTLB configuration
#
# Note: This script does calculation for all shared memory
# segments available when the script is run, no matter it
# is an Oracle RDBMS shared memory segment or not.
# Check for the kernel version
KERN=`uname -r | awk -F. '{ printf("%d.%dn",$1,$2); }'`
# Find out the HugePage size
HPG_SZ=`grep Hugepagesize /proc/meminfo | awk {'print $2'}`
# Start from 1 pages to be on the safe side and guarantee 1 free HugePage
NUM_PG=1
# Cumulative number of pages required to handle the running shared memory segments
for SEG_BYTES in `ipcs -m | awk {'print $5'} | grep "[0-9][0-9]*"`
do
MIN_PG=`echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q`
if [ $MIN_PG -gt 0 ]; then
NUM_PG=`echo "$NUM_PG+$MIN_PG+1" | bc -q`
fi
done
# Finish with results
case $KERN in
'2.4') HUGETLB_POOL=`echo "$NUM_PG*$HPG_SZ/1024" | bc -q`;
echo "Recommended setting: vm.hugetlb_pool = $HUGETLB_POOL" ;;
'2.6'|'3.8') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
*) echo "Unrecognized kernel version $KERN. Exiting." ;;
esac
# End

Et appliquer la recommandation :
en direct sysctl -w vm.nr_hugepages=value_displayed_in_step_5
et en config vm.nr_hugepages=value_displayed_in_step_5

Désactiver les HP transparentes

Si l’un de ces fichiers est là, c’est qu’elles sont activées
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
ou
cat /sys/kernel/mm/transparent_hugepage/enabled
Il faut alors ajouter cette ligne au gestionnaire de démarrage : /etc/grub.conf
transparent_hugepage=never

Désactiver SELinux

Sur une machine de production, on est normallement protéger par un pare-feu, il ne sert à rien d’avoir une composante logicielle pour verrouiller la machine.

Pour voir le statut de SELinux
sestatus
Pour désactiver à chaud SELinux :
sudo setenforce 0
Open the /etc/selinux/config file and set the SELINUX mod to disabled