<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.silverlake.fr/index.php?feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Silverlake - Le blog de ADIMCOR</title>
  <link>http://www.silverlake.fr/index.php?</link>
  <atom:link href="http://www.silverlake.fr/index.php?feed/rss2" rel="self" type="application/rss+xml"/>
  <description></description>
  <language>fr</language>
  <pubDate>Thu, 19 Jan 2023 08:00:00 +0100</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>

  
  <item>
    <title>Etendre la swap en LVM sur Red Hat/CentOS</title>
    <link>http://www.silverlake.fr/index.php?post/2022/11/20/Etendre-la-swap-en-LVM-sur-Red-Hat/CentOS</link>
    <guid isPermaLink="false">urn:md5:856d90f1fb803132a321394a158f2f33</guid>
    <pubDate>Sun, 20 Nov 2022 11:13:00 +0100</pubDate>
    <dc:creator>Silverlake</dc:creator>
        <category>Linux</category>
        
    <description>    &lt;p&gt;Désactiver la swap actuelle&lt;/p&gt;
&lt;pre&gt;
swapoff -v /dev/VolGroup00/LogVol01
&lt;/pre&gt;

&lt;p&gt;Retailler le LV par exemple à 8Go&lt;/p&gt;
&lt;pre&gt;
lvresize /dev/VolGroup00/LogVol01 -L 8G
&lt;/pre&gt;

&lt;p&gt;Recréer l'espace swap&lt;/p&gt;
&lt;pre&gt;
mkswap /dev/VolGroup00/LogVol01
&lt;/pre&gt;

&lt;p&gt;Activer la swap&lt;/p&gt;
&lt;pre&gt;
swapon -v /dev/VolGroup00/LogVol01
&lt;/pre&gt;</description>

    

      </item>
  
  <item>
    <title>Playbook ansible pour installation Oracle 19c</title>
    <link>http://www.silverlake.fr/index.php?post/2021/02/13/Playbook-ansible-pour-installation-Oracle-19c</link>
    <guid isPermaLink="false">urn:md5:d4e4228c226bf624f1e2eac015b694e5</guid>
    <pubDate>Sat, 13 Feb 2021 18:01:00 +0100</pubDate>
    <dc:creator>Silverlake</dc:creator>
        <category>Oracle</category>
        
    <description>    &lt;h3&gt;Introduction&lt;/h3&gt;

&lt;p&gt;Le précédent billet présentait l'installation d'un serveur Oracle 19c en mode stand-alone. Il peut être intéressant d'utiliser ansible pour des déploiement massifs. C'est ce que détaille cet article. Le système d'exploitation est Red Hat / CentOS 7.&lt;/p&gt;

&lt;h3&gt;Pré-requis&lt;/h3&gt;

&lt;p&gt;Il faut dans un premier temps disposer du fichier des binaires oracle 19c -&amp;gt; LINUX.X64_193000_db_home.zip ( voir site oracle ou billet précédent )&lt;/p&gt;


&lt;p&gt;Il est également nécessaire de prévoir certains fichiers qui seront utilisés soit par le module copy, soit par le module template.&lt;/p&gt;


&lt;p&gt;Le playbook fait référence à des machines regroupées dans l'inventaire sous le nom oracle.&lt;/p&gt;

&lt;h4&gt;Fichier db19c.rsp ( installation silencieuse oracle )&lt;/h4&gt;
&lt;pre&gt;
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v19.0.0
oracle.install.option=INSTALL_DB_SWONLY
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/ora01/app/oraInventory
ORACLE_HOME=/ora01/app/oracle/product/19/DB
ORACLE_BASE=/ora01/app/oracle
oracle.install.db.InstallEdition=EE
oracle.install.db.OSDBA_GROUP=dba
oracle.install.db.OSOPER_GROUP=oper
oracle.install.db.OSBACKUPDBA_GROUP=backupdba
oracle.install.db.OSDGDBA_GROUP=dgdba
oracle.install.db.OSKMDBA_GROUP=kmdba
oracle.install.db.OSRACDBA_GROUP=racdba
oracle.install.db.rootconfig.executeRootScript=false
&lt;/pre&gt;

&lt;h4&gt;Fichier listener.j2 ( module template )&lt;/h4&gt;
&lt;pre&gt;
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION = 
     (ADDRESS=(PROTOCOL = TCP)(HOST = {{ansible_fqdn}} )(PORT = 1521))
    )
  )
&lt;/pre&gt;

&lt;p&gt;On utilise ici la variable ansible_fqdn qui donne le nom complet du serveur.&lt;/p&gt;

&lt;h4&gt;Fichier login.sql ( Paramétrage sqlplus )&lt;/h4&gt;
&lt;pre&gt;
define _editor=vi
set sqlprompt '&amp;amp;_user.@&amp;amp;_connect_identifier. &amp;gt;'
set linesize 250
set pagesize 50
&lt;/pre&gt;

&lt;h4&gt;Fichier oracle.service ( Demarrage via systemctl )&lt;/h4&gt;
&lt;pre&gt;
[Unit]
Description=oracle
After=syslog.target
After=network.target

[Service]
Type=forking
Environment=ORACLE_HOME=/ora01/app/oracle/product/19/DB 
User=oracle 
Group=oinstall 
ExecStart=/ora01/app/oracle/product/19/DB/bin/dbstart ${ORACLE_HOME} 
ExecStop=/ora01/app/oracle/product/19/DB/bin/dbshut ${ORACLE_HOME}

[Install]
WantedBy=multi-user.target
&lt;/pre&gt;

&lt;h3&gt;Le playbook&lt;/h3&gt;
&lt;pre&gt;
---
- name: &amp;quot;Configuration Oracle 19c stand-alone&amp;quot;
  hosts: oracle
  tasks:
    - name: Packages oracle19c pour CentOS 7 ( obligatoires )
      yum:
        name: ['compat-libcap1','gcc','gcc-c++','ksh','libaio-devel','nfs-utils','sysstat','unzip','bind-utils','smartmontools','libXtst']
        state: present
    - name: Packages oracle19c pour CentOS 7 ( optionnels )
      yum:
        name: ['vim-enhanced','psmisc','net-tools','perl-TermReadKey']
        state: present
    - name : Parametrage noyau oracle19c
      sysctl:
        name: &amp;quot;{{ item.name }}&amp;quot;
        value: &amp;quot;{{ item.value }}&amp;quot;
      loop:
        - { name: 'kernel.shmall',value: '2097152' }
        - { name: 'kernel.shmmax',value: '8589934592' }
        - { name: 'kernel.shmmni',value: '4096' }
        - { name: 'kernel.sem',value: '250 32000 100 128' }
        - { name: 'kernel.panic_on_oops',value: '1' }
        - { name: 'fs.file-max',value: '6815744' }
        - { name: 'fs.aio-max-nr',value: '1048576' }
        - { name: 'net.ipv4.ip_local_port_range',value: '9000 65500' }
        - { name: 'net.core.rmem_default',value: '262144' }
        - { name: 'net.core.rmem_max',value: '4194304' }
        - { name: 'net.core.wmem_default',value: '262144' }
        - { name: 'net.core.wmem_max',value: '1048576' }
        - { name: 'net.ipv6.conf.all.disable_ipv6',value: '1' }
        - { name: 'net.ipv6.conf.default.disable_ipv6',value: '1' }
        - { name: 'vm.swappiness',value: '1' }
        - { name: 'vm.dirty_background_ratio',value: '3' }
        - { name: 'vm.dirty_ratio',value: '80' }
        - { name: 'vm.dirty_expire_centisecs',value: '500' }
        - { name: 'vm.dirty_writeback_centisecs',value: '100' }
    - name: Parametrage limites pour oracle 19c
      pam_limits:
        domain: &amp;quot;{{item.domain}}&amp;quot;
        limit_type: &amp;quot;{{item.limit_type}}&amp;quot;
        limit_item: &amp;quot;{{item.it}}&amp;quot;
        value: &amp;quot;{{item.value}}&amp;quot;
      loop:
        - { domain: 'oracle', limit_type: 'soft', it: 'nproc', value: '16384' }
        - { domain: 'oracle', limit_type: 'hard', it: 'nproc', value: '16384' }
        - { domain: 'oracle', limit_type: 'soft', it: 'nofile', value: '1024' }
        - { domain: 'oracle', limit_type: 'hard', it: 'nofile', value: '65536' }
        - { domain: 'oracle', limit_type: 'soft', it: 'stack', value: '10240' }
        - { domain: 'oracle', limit_type: 'hard', it: 'stack', value: '32768' }
    - name : Creation des groupes
      group:
        name: &amp;quot;{{ item.name }}&amp;quot;
        gid: &amp;quot;{{ item.gid }}&amp;quot;
      loop:
        - { name: 'oinstall', gid: '1001' }
        - { name: 'dba', gid: '1002' }
        - { name: 'oper', gid: '1003' }
        - { name: 'backupdba', gid: '1004' }
        - { name: 'dgdba', gid: '1005' }
        - { name: 'kmdba', gid: '1006' }
        - { name: 'racdba', gid: '1007' }
        - { name: 'asmadmin', gid: '1008' }
        - { name: 'asmdba', gid: '1009' }
        - { name: 'asmoper', gid: '1010' }
    - name: Creation user oracle
      user:
        name: oracle
        uid: 1001
        group: oinstall
        groups: dba,oper,backupdba,dgdba,kmdba,racdba,asmdba
        password: orPMdIdQOZmn.
        # Le mot de passe oracle est oracle01
    - name: Suppression fichier profile
      file:
        path: /etc/profile.d/oracle.sh
        state: absent
    - name: Profile oracle
      blockinfile:
        path: /etc/profile.d/oracle.sh
        create: yes
        block: |
          if [ $USER = &amp;quot;oracle&amp;quot; ]; then
            if [ $SHELL = &amp;quot;/bin/ksh&amp;quot; ]; then
              ulimit -p 16384
              ulimit -n 65536
            else
              ulimit -u 16384 -n 65536
            fi
          fi
    - name: Suppresion repertoire
      file:
        path: /ora01
        state: absent
    - name: Suppression de /etc/oraInst.loc
      file:
        path: /etc/oraInst.loc
        state: absent
    - name: Création répertoire
      file:
        path: /ora01/app/oracle/product/19/DB
        state: directory
        owner: oracle
        group: oinstall
    - name: Repertoire INSTALL
      file:
        path: /INSTALL
        state: directory
        mode: 1777
    - name: Copie fichier zip
      copy:
        src: LINUX.X64_193000_db_home.zip
        dest: /INSTALL
    - name: Extraction du binaire 
      unarchive:
        src: /INSTALL/LINUX.X64_193000_db_home.zip
        dest: /ora01/app/oracle/product/19/DB
        owner: oracle
        group: oinstall
        remote_src: yes
    - name: Fichier réponse
      copy:
        src: db19c.rsp
        dest: /home/oracle
        owner: oracle
        group: oinstall
    - name: Configuration pare-feu
      firewalld:
        port: 1521/tcp
        permanent: yes
        state: enabled
        immediate: yes
    - name: Installation
      command: /ora01/app/oracle/product/19/DB/runInstaller -silent -responsefile /home/oracle/db19c.rsp -waitforcompletion
      become: yes
      become_user: oracle
    - name: Changement des droits
      command: /ora01/app/oraInventory/orainstRoot.sh
    - name: Suppression bash_profile de oracle
      file:
        path: /home/oracle/.bash_profile
        state: absent
    - name: Configuration bash_profile oracle
      blockinfile:
        path: /home/oracle/.bash_profile
        block: |
          if [ -f ~/.bashrc ]; then
            . ~/.bashrc
          fi
          export ORACLE_BASE=/ora01/app/oracle
          export ORACLE_HOME=$ORACLE_BASE/product/19/DB
          export LD_LIBRARY_PATH=$ORACLE_HOME/lib
          export ORACLE_OWNER=oracle
          export PATH=$PATH:$ORACLE_HOME/bin
          export NLS_LANG=FRENCH_FRANCE.UTF8 
          export NLS_DATE_FORMAT='DD/MM/YYYY HH24:MI:SS'
          export SQLPATH=$HOME/sql
          export ORACLE_PATH=$SQLPATH
          export TNS_ADMIN=$ORACLE_HOME/network/admin
        create: yes
        owner: oracle
        group: oinstall
    - name: Configuration listener
      template:
        src: /home/listener.j2
        dest: /ora01/app/oracle/product/19/DB/network/admin/listener.ora
        owner: oracle
        group: oinstall
    - name: Script demmarage oracle
      copy:
        src: oracle.service
        dest: /usr/lib/systemd/system
    - name: Activation script oracle
      service:
        name: oracle
        enabled: yes
    - name: Fichier /etc/oratab
      file:
        path: /etc/oratab
        owner: oracle
        group: oinstall
        mode: 0664
        state: touch
    - name: Repertoire SQL
      file:
        path=/home/oracle/sql
        state=directory
        owner=oracle
        group=oinstall
    - name: Copie login.sql
      copy:
        src=login.sql
        dest=/home/oracle/sql
        owner=oracle
        group=oinstall
&lt;/pre&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;Ce playbook utilise le compte root pour déployer sur les serveurs distants. Il est facilement modifiable pour y ajouter toute autre configuration ...&lt;/p&gt;</description>

    

      </item>
  
  <item>
    <title>Installation Oracle 19c</title>
    <link>http://www.silverlake.fr/index.php?post/2020/12/10/Installation-Oracle-19c</link>
    <guid isPermaLink="false">urn:md5:2f3c9d245dc39e951c39e2c029367567</guid>
    <pubDate>Thu, 10 Dec 2020 10:51:00 +0100</pubDate>
    <dc:creator>Silverlake</dc:creator>
        <category>Oracle</category>
        
    <description>    &lt;h3&gt;Introduction&lt;/h3&gt;

&lt;p&gt;L'objectif de ce billet est de présenter la mise en place d'un serveur Oracle en stand-alone version 19c. La version 19c est en fait la version 12.2.0.3, depuis 2018 Oracle a modifié la numérotation des versions en se basant sur l'année de sortie.&lt;/p&gt;


&lt;p&gt;L'accent est mis avant tout sur le coté pratique par la mise en place d'une maquette mais en simulant un environnement de production. l'objectif est d'aborder la mise en oeuvre et l'administration dans des conditions optimales du SGBD Oracle 19c en mode stand alone. Ce billet comporte aussi une approche de la sauvegarde et la restauration avec RMAN.&lt;/p&gt;


&lt;h3&gt;Rappel important&lt;/h3&gt;

&lt;p&gt;Les produits de la société Oracle sont soumis à licence. Oracle accorde un droit d'utilisation libre à des fins de développement ou d'évaluation. Il est interdit d'utiliser les produits Oracle en production sans acquisition de licence. Les différents produits peuvent être téléchargés en respectant les termes d'utilisation via ce lien : https://www.oracle.com/fr/DOWNLOADS/&lt;/p&gt;


&lt;p&gt;Ce billet est conçu pour Linux CentOS 7, version libre de RedHat 7. L'adaptation à une version antérieure est possible ainsi que d'utiliser Windows. En fait quelque soit la plate-forme OS les principes d'administration Oracle sont identiques. La version oracle étudiée est la 19.3.0.0 elle n'existe qu'en 64bits, comme CentOS 7 d'ailleurs. Sortie en janvier 2019 elle sera supportée jusqu'en 2025. Le schéma ci-dessous présente le cycle de vie des différentes versions de Oracle Database ( Document source Oracle Corp ).&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.silverlake.fr/public/version_oracle.jpg&quot; alt=&quot;version_oracle.jpg, janv. 2020&quot; /&gt;&lt;/p&gt;


&lt;p&gt;L'essentiel des manipulations se fait en ligne de commande via une connexion ssh.&lt;/p&gt;


&lt;h3&gt;Plate-forme technique&lt;/h3&gt;

&lt;p&gt;L'environnement de départ est une machine virtuelle sous VirtualBox nommée ORA01 avec les caractéristiques suivantes :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OS : CentOS 7.7 64 bits&lt;/li&gt;
&lt;li&gt;RAM : 8Go&lt;/li&gt;
&lt;li&gt;2 VCPUS&lt;/li&gt;
&lt;li&gt;Disque système : 100Go. 2 partitions :&lt;/li&gt;
&lt;li&gt;swap : 8Go&lt;/li&gt;
&lt;li&gt;/ : le reste ( environ 92Go )&lt;/li&gt;
&lt;li&gt;IP : 192.168.56.11/24&lt;/li&gt;
&lt;li&gt;Compte root mot de passe root01&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Le choix de VirtualBox n'est pas obligatoire, ce produit est simple et disponible gratuitement sur tout OS. Il est toutefois utile de préciser que les performances resteront modestes.&lt;/p&gt;


&lt;p&gt;La version 19c de Oracle est un peu plus “gourmande” en mémoire que les précédentes. 8Go est un minimum. Les tests peuvent être fait avec seulement 4Go, il y a aura toutefois des warnings non bloquants lors de l'installation.&lt;/p&gt;


&lt;p&gt;Afin de bien simuler un cas de production il ne sera fait appel à aucune interface graphique. Toute la configuration se faisant en ligne de commande via SSH ( Y compris la gestion des VM ).&lt;/p&gt;


&lt;p&gt;La machine virtuelle de base, fichier ora01.ova, est disponible via l'URL suivante : http://files.silverlake.space&lt;/p&gt;


&lt;p&gt;Il suffit de télécharger le fichier ora01.ova et de l'importer via la commande vboxmanage.&lt;/p&gt;
&lt;pre&gt;
wget http://files.silverlake.space/ora01.ova
vboxmanage import ora01.ova
&lt;/pre&gt;

&lt;p&gt;Quelques scripts un peu longs sont disponibles en téléchargement sur la même URL. L'utilisation de ces scripts sera vue plus tard.&lt;/p&gt;

&lt;h3&gt;Installation d'un serveur Oracle&lt;/h3&gt;

&lt;p&gt;L'installation des binaires Oracle est sans doute la première action d'un DBA. Il est nécessaire d'y apporter un soin particulier. De nombreux dysfonctionnements viennent d'une installation mal réalisée ou mal maîtrisée.&lt;/p&gt;


&lt;p&gt;Une interface graphique est normalement requise. Comme il fut précisé au début de ce document, l'objectif est de simuler un cas de production. Sur de nombreux environnements l'unique moyen de connexion au serveur est SSH rendant ainsi quasiment impossible l'utilisation de l'interface graphique. Il faut alors se tourner vers l'installation silencieuse via un fichier texte. C'est ici la méthode retenue.&lt;/p&gt;


&lt;p&gt;La machine virtuelle de base ne comporte que les composants essentiels d'un serveur Linux ( Meta Package Core ). Pour installer un serveur Oracle il est nécessaire de procéder à certains ajustements notamment l'installation de packages complémentaires. Pour se faire il faut configurer un dépôt RPM.&lt;/p&gt;

&lt;h4&gt;Dépôt RPM&lt;/h4&gt;

&lt;p&gt;Dans cette procédure la VM ne dispose pas d'accès Internet. Le plus simple est de monter le DVD de la distribution sur la VM et de configurer yum pour utiliser le DVD comme dépôt. Le paragraphe suivant montre cette méthode.&lt;/p&gt;


&lt;p&gt;Dans un premier temps sur l'hôte de virtualisation récupérer l'image ISO du DVD CentOS 7. Il existe sur le web un grand nombre de miroirs permettant ceci. L'exemple suivant utilise un miroir sur infoline.de.&lt;/p&gt;
&lt;pre&gt;
wget http://mirror.infonline.de/centos/7.7.1908/isos/x86_64/CentOS-7-x86_64-DVD-1908.iso
&lt;/pre&gt;

&lt;p&gt;Attacher l'ISO à la VM&lt;/p&gt;
&lt;pre&gt;
vboxmanage storageattach ORA01 --storagectl IDE --port 0 --device 0 --type dvddrive --medium CentOS-7-x86_64-DVD-1908.iso
&lt;/pre&gt;

&lt;p&gt;Désactiver le boot sur ce DVD en ne conservant que le boot sur le disque dur.&lt;/p&gt;
&lt;pre&gt;
vboxmanage modifyvm ORA01 --boot1 disk
vboxmanage modifyvm ORA01 --boot2 none
vboxmanage modifyvm ORA01 --boot3 none
vboxmanage modifyvm ORA01 --boot4 none
&lt;/pre&gt;

&lt;p&gt;Lancer la VM et vérifier la présence du DVD.&lt;/p&gt;
&lt;pre&gt;
vboxmanage startvm ORA01 --type headless
&lt;/pre&gt;

&lt;p&gt;Le démarrage en &quot;type headless'' permet de ne pas lancer la console. Une fois lancer se connecter root sur cette VM -&amp;gt; ssh root@192.168.56.11. La commande //lsblk// permet de vérifier la présence du DVD.&lt;/p&gt;
&lt;pre&gt;
[root@ora01 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  100G  0 disk 
├─sda1   8:1    0   96G  0 part /
└─sda2   8:2    0    4G  0 part [SWAP]
sr0     11:0    1  4,4G  0 rom  
sr1     11:1    1 1024M  0 rom  
[root@ora01 ~]#
&lt;/pre&gt;

&lt;p&gt;Le DVD est bien présent sur le device /dev/sr0. Créer un point de montage et monter l'ISO&lt;/p&gt;
&lt;pre&gt;
mkdir /centos
mount -o ro /dev/sr0 /centos
&lt;/pre&gt;

&lt;p&gt;Vérification&lt;/p&gt;
&lt;pre&gt;
[root@ora01 ~]# df -hT
Sys. de fichiers Type     Taille Utilisé Dispo Uti% Monté sur
devtmpfs         devtmpfs   2,0G       0  2,0G   0% /dev
tmpfs            tmpfs      2,0G       0  2,0G   0% /dev/shm
tmpfs            tmpfs      2,0G    8,5M  2,0G   1% /run
tmpfs            tmpfs      2,0G       0  2,0G   0% /sys/fs/cgroup
/dev/sda1        ext4        95G    1,3G   89G   2% /
tmpfs            tmpfs      396M       0  396M   0% /run/user/0
/dev/sr0         iso9660    4,4G    4,4G     0 100% /centos
[root@ora01 ~]# 
&lt;/pre&gt;

&lt;p&gt;Rendre ce montage permanent&lt;/p&gt;
&lt;pre&gt;
cat /etc/mtab | grep centos &amp;gt;&amp;gt; /etc/fstab
&lt;/pre&gt;

&lt;p&gt;Configurer ensuite le dépôt sur ce point de montage. Se positionner sous /etc/yum.repos.d et supprimer tous les fichiers.&lt;/p&gt;
&lt;pre&gt;
cd /etc/yum.repos.d
rm -f *
&lt;/pre&gt;

&lt;p&gt;Sous ce même répertoire créer le fichier dvd.repo avec les lignes suivantes :&lt;/p&gt;
&lt;pre&gt;
[DVD]
name=DVD
baseurl=file:///centos
enabled=1
gpgcheck=0
&lt;/pre&gt;

&lt;p&gt;La commande yum utilisera dorénavant le DVD.&lt;/p&gt;

&lt;h3&gt;Configuration système pour Oracle 19c&lt;/h3&gt;

&lt;p&gt;Le serveur est installé avec l'OS CentOS 7 minimal ( Meta package Core ). Seul le compte root est en place. Il est nécessaire de procéder à des ajustements sur la configuration OS :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utilisateur et Groupes&lt;/li&gt;
&lt;li&gt;Paramétrage noyau&lt;/li&gt;
&lt;li&gt;Limites&lt;/li&gt;
&lt;li&gt;Parefeu&lt;/li&gt;
&lt;li&gt;SELinux&lt;/li&gt;
&lt;li&gt;Packages complémentaires&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Utilisateur et groupes&lt;/h4&gt;

&lt;p&gt;Par convention, les binaires RDBMS sont possédés et exécutés par un utilisateur dédié -&amp;gt; oracle. Il faut être attentif à une affectation correcte des UID et GID. Dans un cluster RAC, ils doivent être identiques entre tous les noeuds. Même si ceci est d'une importance moindre dans une serveur stand-alone il est de bonne pratique de respecter cette convention&lt;/p&gt;


&lt;p&gt;L'utilisateur oracle fait partie de plusieurs groupes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;oinstall : groupe possédant les binaires. C'est le groupe principe du user oracle.&lt;/li&gt;
&lt;li&gt;dba : Ce groupe permet **la connexion as sysdba**.&lt;/li&gt;
&lt;li&gt;oper : groupe facultatif permettant **la connexion as sysoper**&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La version 19c de Oracle a introduit 4 nouveaux groupes&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;backupdba : groupe dédié au sauvegarde/restauration notamment RMAN&lt;/li&gt;
&lt;li&gt;dgdba : groupe pour la gestion dataguard&lt;/li&gt;
&lt;li&gt;kmdba : groupe pour la gestion du cryptage&lt;/li&gt;
&lt;li&gt;racdba : gestion du grid infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il existe aussi 3 autres groupes pour la gestion ASM.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;asmdba : groupe possédant l'accès aux disques ASM.&lt;/li&gt;
&lt;li&gt;asmadmin : privilège as sysasm, notamment pour la gestion des diskgroups.&lt;/li&gt;
&lt;li&gt;asmoper : groupe facultatif connexion idem oper pour database.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En utilisation basique ou dans les structures peu importantes, différentier les groupes ne présente pas de vraie valeur ajoutée. Il est possible de tout faire en utilisant juste le groupe dba. Il est alors nécessaire lors de l’installation de bien spécifier correctement chaque groupe même si c'est le même pour tous. Il faut toutefois faire attention car lors de l'installation des warnings sont générés.&lt;/p&gt;


&lt;p&gt;Dans l'exemple afin de rester &quot;classique&quot; avec les différentes documentions existantes et en accord avec OFA tous les groupes seront mis en place.&lt;/p&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;Création des groupes par la commande groupadd&lt;/p&gt;
&lt;pre&gt;
groupadd -g 1001 oinstall
groupadd -g 1002 dba
groupadd -g 1003 oper
groupadd -g 1004 backupdba
groupadd -g 1005 dgdba
groupadd -g 1006 kmdba
groupadd -g 1007 racdba
groupadd -g 1008 asmdba
groupadd -g 1009 asmadmin
groupadd -g 1010 asmoper
&lt;/pre&gt;

&lt;p&gt;Création du user oracle ( commande useradd ). Le groupe principal est oinstall, les secondaires sont tous les autres créés ci-dessus pour oracle.&lt;/p&gt;
&lt;pre&gt;
useradd -u 501 -g oinstall -G dba,oper,backupdba,kmdba,dgdba,racdba,asmdba,asmadmin,asmoper -d /home/oracle -s /bin/bash oracle
&lt;/pre&gt;

&lt;p&gt;Donner un mot de passe au user oracle, dans le cadre de ce cours : //oracle01//. En production donner une mot de passe plus robuste.&lt;/p&gt;
&lt;pre&gt;
passwd oracle
&lt;/pre&gt;

&lt;p&gt;La commande id permet de vérifier l'affectation correcte aux groupes.&lt;/p&gt;
&lt;pre&gt;
id oracle
uid=501(oracle) gid=1001(oinstall) groupes=1001(oinstall),1002(dba),1003(oper),1004(backupdba),1005(dgdba),1006(kmdba),1007(racdba),1008(asmdba),1009(asmadmin),1010(asmoper)
&lt;/pre&gt;

&lt;p&gt;Il est important de vérifier que la commande umask du user oracle renvoie bien la valeur 0022.&lt;/p&gt;

&lt;h4&gt;Paramétrage noyau&lt;/h4&gt;

&lt;p&gt;Oracle demande quelques ajustements du noyau Linux en particulier sur la gestion mémoire et les processus via les sémaphores. Pour rendre ces paramètres permanents il faut les inscrire dans le fichier /etc/sysctl.conf.
Ci dessous le fichier /etc/sysctl.conf utilisé.&lt;/p&gt;
&lt;pre&gt;
# Memoire partagee
# kernel.shmall limite la taille de la shared memory ( penser à la PGA et à l'OS... )
# Si 8Go de RAM : 6 * 1024 * 1024 * 1024 / 4096 = 1572864
# Valeur minimale de shmall : 1021796
kernel.shmall = 1572864
kernel.shmmax = 4185278464
kernel.shmmni = 4096

# Semaphores
kernel.sem = 250 32000 100 128

kernel.panic_on_oops = 1

# Nbre fichiers
fs.file-max = 6815744
fs.aio-max-nr = 1048576

# Reseau
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576

# Desactive totalement IPV6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

# Optimisation mémoire
vm.swappiness = 1
vm.dirty_background_ratio = 3
vm.dirty_ratio = 80
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Les valeurs type shm concernent la Shared Memory, donc la SGA de Oracle.&lt;/li&gt;
&lt;li&gt;Les valeurs type sem concernent les sémaphores donc liées au paramètre PROCESSES de Oracle.&lt;/li&gt;
&lt;li&gt;Les valeurs type net sont relatives au réseau.&lt;/li&gt;
&lt;li&gt;Les valeurs type vm sont relatives à la mémoire et notamment sur la gestion des dirty block dans le database buffer cache.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ne pas oublier que ces valeurs partent du principe que seul Oracle tourne sur le serveur. D'autres logiciels utilisent aussi la Shared Memory et les sémaphores.&lt;/p&gt;


&lt;p&gt;Sur certaines configuration le calcul suivant peut être fait ici l'exemple avec 16Go de RAM :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;kernel.shmall : 40% RAM en pages mémoire ( 4096 ) : 16 * 0.4 * 1024 * 1024 * 1024 / 4096 = 1677722.&lt;/li&gt;
&lt;li&gt;kernel.shmmax : 50% RAM en bytes : 16 * 0.5 * 1024 * 1024 * 1024 = 8589934592&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Activer la configuration par la commande suivante :&lt;/p&gt;
&lt;pre&gt;
sysctl -p
&lt;/pre&gt;

&lt;p&gt;Dans cette configuration la gestion de la mémoire n'utilise pas les HugePages. L'utilisation des HugesPages demande des précautions et fera l'objet d'un paragraphe séparé plus loin dans ce document.&lt;/p&gt;

&lt;h4&gt;Paramétrage des limites&lt;/h4&gt;

&lt;p&gt;Les limites sont relatives aux ressources utilisées par un user particulier, en l'occurrence ici oracle. Sont concernées le nombre de processus et de fichiers ouverts.&lt;/p&gt;


&lt;p&gt;Ajouter au fichier /etc/security/limits.conf les lignes suivantes :&lt;/p&gt;
&lt;pre&gt;
oracle soft nproc 16384
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft stack 10240
oracle hard stack 32768
&lt;/pre&gt;

&lt;p&gt;Ces limites n'influencent pas sur les performances. Par contre elles peuvent gêner leur bon fonctionnement.&lt;/p&gt;


&lt;p&gt;La limite soft d'un utilisateur peut être modifiée par l'utilisateur lui-même, mais sans toutefois dépasser la limite hard.&lt;/p&gt;


&lt;p&gt;Cette configuration permet de définir les limites soft et hard d'un user. La commande ulimit permet à un utilisateur de modifier ses limites pour le shell courant.&lt;/p&gt;


&lt;p&gt;Modifier le fichier /etc/pam.d/login et ajouter la ligne suivante :&lt;/p&gt;
&lt;pre&gt;
session required pam_limits.so
&lt;/pre&gt;

&lt;p&gt;Dans le répertoire /etc/profile.d créer le fichier oracle.sh avec les lignes suivantes :&lt;/p&gt;
&lt;pre&gt;
if [ $USER = &amp;quot;oracle&amp;quot; ]; then
  if [ $SHELL = &amp;quot;/bin/ksh&amp;quot; ]; then
    ulimit -p 16384
    ulimit -n 65536
  else
    ulimit -u 16384 -n 65536
  fi
fi
&lt;/pre&gt;

&lt;h4&gt;SELinux&lt;/h4&gt;

&lt;p&gt;Oracle 19c est compatible avec SELinux, il est donc conseillé de laisser la valeur par défaut, soit Enforcing, en place. Il reste possible de désactiver totalement SELinux en éditant le fichier /etc/selinux/config et en paramétrant la clause SELINUX à la valeur disabled.&lt;/p&gt;


&lt;p&gt;La commande getenforce permet de connaitre la valeur de SELinux.&lt;/p&gt;

&lt;h4&gt;Pare-feu&lt;/h4&gt;

&lt;p&gt;La gestion du pare-feu sous CentOS 7 utilise firewalld. Dans un soucis de simplification il est possible de désactiver le pare-feu. Les deux commandes suivantes permettent ceci.&lt;/p&gt;
&lt;pre&gt;
systemctl stop firewalld
systemctl disable firewalld
&lt;/pre&gt;

&lt;h4&gt;Packages complémentaires&lt;/h4&gt;

&lt;p&gt;Il s'agit ici des packages requis par Oracle pour l'installation de ses binaires. Les documentations font état d'une liste assez longue de packages. Par le jeu des dépendances la liste suivante est suffisante.&lt;/p&gt;
&lt;pre&gt;
yum -y install compat-libcap1 gcc gcc-c++ ksh libaio-devel nfs-utils sysstat unzip bind-utils smartmontools
&lt;/pre&gt;

&lt;p&gt;Même si la gestion graphique n'est pas requise il faut installer le package suivant relatif aux librairies X et ce afin d'éviter un warning lors de l'installation.&lt;/p&gt;
&lt;pre&gt;
yum -y install libXtst
&lt;/pre&gt;

&lt;p&gt;Les packages suivants ne sont pas indispensables,mais ils apportent un confort d'utilisation.&lt;/p&gt;
&lt;pre&gt;
yum -y install vim-enhanced psmisc net-tools
&lt;/pre&gt;

&lt;h4&gt;PERL&lt;/h4&gt;

&lt;p&gt;Depuis la version 12c Oracle utilise massivement des scripts PERL, notamment si la gestion multitenant est en place et que l'on souhaite utiliser des pluggable database. Pour passer certains scripts SQL, notamment catalog, catproc,... Oracle conseille de ne pas utiliser SQL*Plus mais catcon.pl. En cas d'installation minimale de CentOS 7 il faut installer un module PERL supplémentaire  ( perl-TermReadKey ) sinon catcon échoue ( voir exemple ci-dessous )&lt;/p&gt;
&lt;pre&gt;
perl catcon.pl
Can't locate Term/ReadKey.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 . ./) at catcon.pm line 189.
BEGIN failed--compilation aborted at catcon.pm line 189.
Compilation failed in require at catcon.pl line 94.
BEGIN failed--compilation aborted at catcon.pl line 94.
&lt;/pre&gt;

&lt;p&gt;L'installation du module requis est simple&lt;/p&gt;
&lt;pre&gt;
yum -y install perl-TermReadKey
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;vim-enhanced est un éditeur évolué base sur vi.&lt;/li&gt;
&lt;li&gt;psmisc contient la commande pstree et fuser ( indispensable pour PSU )&lt;/li&gt;
&lt;li&gt;net-tools contient la commande ifconfig( obsolète normalement au profit de la commande ip ).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Installation des binaires Oracle&lt;/h3&gt;

&lt;p&gt;Les fichiers sources proviennent du https://www.oracle.com/database/technologies/oracle19c-linux-downloads.html :&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.silverlake.fr/public/binaires19c.jpg&quot; alt=&quot;binaires19c.jpg, déc. 2020&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LINUX.X64_193000_db_home.zip : RDBMS&lt;/li&gt;
&lt;li&gt;LINUX.X64_193000_grid_home.zip : Grid Infrastructure ( pour la gestion ASM )&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sur la VM les binaires zippés seront placées dans le répertoire /INSTALL/. Dans un premier temps seul le fichier LINUX.X64_193000_db_home.zip ( RDBMS ) sera utilisé, le fichier LINUX.X64_193000_grid_home.zip relatif au Grid Infrastructure sera vu dans un autre billet.&lt;/p&gt;


&lt;p&gt;En connexion root, créer le répertoire /INSTALL sur la VM et affecter les bons droits&lt;/p&gt;
&lt;pre&gt;
mkdir /INSTALL
chmod 1777 /INSTALL
&lt;/pre&gt;

&lt;p&gt;Transférer ensuite les fichiers zip chargés depuis le site Oracle dans ce répertoire.&lt;/p&gt;


&lt;p&gt;Depuis la version 12.2.0.1 l'installation des binaires est simplifiée. Il faut décompresser le fichier zip dans le répertoire pointé par ORACLE_HOME et lancer l'installation.&lt;/p&gt;


&lt;p&gt;Sous l'identité root créer le répertoire /ora01 et affecter les bons droits.&lt;/p&gt;
&lt;pre&gt;
mkdir /ora01
chown -R oracle:oinstall /ora01
&lt;/pre&gt;

&lt;p&gt;Sous l'identité oracle créer le répertoire ORACLE_HOME&lt;/p&gt;
&lt;pre&gt;
mkdir -p /ora01/app/oracle/product/19/DB
&lt;/pre&gt;

&lt;p&gt;Se positionner sous ce répertoire et decompresser le zip. Attention de bien dezipper en tant que user oracle et non root.&lt;/p&gt;
&lt;pre&gt;
cd /ora01/app/oracle/product/19/DB
unzip /INSTALL/LINUX.X64_193000_db_home.zip
&lt;/pre&gt;

&lt;h4&gt;Installation silencieuse&lt;/h4&gt;

&lt;p&gt;En production les installations se font rarement en graphique mais en mode silencieux. Il faut disposer d'un fichier réponse, un exemple peut être trouvé dans le fichier suivant : /ora01/app/oracle/product/19/DB/install/response/db_install.rsp.&lt;/p&gt;


&lt;p&gt;Sous /home/oracle créer un fichier db19c.rsp avec les lignes suivantes:&lt;/p&gt;
&lt;pre&gt;
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v19.0.0
oracle.install.option=INSTALL_DB_SWONLY
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/ora01/app/oraInventory
ORACLE_HOME=/ora01/app/oracle/product/19/DB
ORACLE_BASE=/ora01/app/oracle
oracle.install.db.InstallEdition=EE
oracle.install.db.OSDBA_GROUP=dba
oracle.install.db.OSOPER_GROUP=oper
oracle.install.db.OSBACKUPDBA_GROUP=backupdba
oracle.install.db.OSDGDBA_GROUP=dgdba
oracle.install.db.OSKMDBA_GROUP=kmdba
oracle.install.db.OSRACDBA_GROUP=racdba
oracle.install.db.rootconfig.executeRootScript=true
oracle.install.db.rootconfig.configMethod=ROOT
&lt;/pre&gt;

&lt;p&gt;Une fois décompacté, il suffit de lancer le programme runInstaller&lt;/p&gt;
&lt;pre&gt;
[oracle@ora01 ~]$ /ora01/app/oracle/product/19/DB/runInstaller -silent -waitforcompletion -responsefile /home/oracle/db19c.rsp

Lancement de l'assistant Configuration d'Oracle Database...

 Entrez le mot de passe de l'utilisateur 'root' : 
Le fichier de réponses pour cette session est accessible sur :
 /ora01/app/oracle/product/19/DB/install/response/db_2020-04-13_03-21-25PM.rsp

Le journal de cette session d'installation se trouve dans :
 /tmp/InstallActions2020-04-13_03-21-25PM/installActions2020-04-13_03-21-25PM.log
Successfully Setup Software.
Les journaux de session d'installation ont été déplacés vers :
 /ora01/app/oraInventory/logs/InstallActions2020-04-13_03-21-25PM
[oracle@ora01 ~]$ 
&lt;/pre&gt;

&lt;h3&gt;Finalisation de l'installation&lt;/h3&gt;

&lt;p&gt;Rajouter les lignes suivantes dans le fichier $HOME/.bash_profile du user oracle.&lt;/p&gt;
&lt;pre&gt;
export ORACLE_BASE=/ora01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/19/DB
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export ORACLE_OWNER=oracle
export PATH=$PATH:$ORACLE_HOME/bin
export NLS_LANG=FRENCH_FRANCE.UTF8 
export NLS_DATE_FORMAT='DD/MM/YYYY HH24:MI:SS'
export SQLPATH=$HOME/sql
export ORACLE_PATH=$SQLPATH
export TNS_ADMIN=$ORACLE_HOME/network/admin
&lt;/pre&gt;

&lt;p&gt;La variable NLS_DATE_FORMAT permet d'avoir dans certains états, notamment RMAN, une datation précise ( par défaut le format est DD/MM/YY ).&lt;/p&gt;


&lt;p&gt;Sourcer ensuite ce fichier&lt;/p&gt;
&lt;pre&gt;
. $HOME/.bash_profile
&lt;/pre&gt;

&lt;p&gt;Créer ensuite le répertoire $HOME/sql. Ce répertoire contiendra les scripts sql pouvant être lancés depuis SQL*Plus sans spécifier l'emplacement ( variable d'environnement SQLPATH ).&lt;/p&gt;
&lt;pre&gt;
mkdir -p $HOME/sql
cd $HOME/sql
&lt;/pre&gt;

&lt;p&gt;Dans ce même répertoire créer un fichier login.sql avec les lignes suivantes. Ce fichier est lu à chaque lancement de SQL*Plus, et permet un paramétrage de l'environnement SQL*Plus.&lt;/p&gt;
&lt;pre&gt;
define _editor=vi
set sqlprompt '&amp;amp;_user.@&amp;amp;_connect_identifier. &amp;gt;'
set linesize 250
set pagesize 50
&lt;/pre&gt;

&lt;p&gt;Ainsi sous SQL*Plus lors de l'appel de l'éditeur vi sera lancé en lieu et place de ed. Le prompt est redéfini afin d'afficher le user et l'alias Oracle*Net ou $ORACLE_SID en cours lors de la session SQL*Plus.&lt;/p&gt;


&lt;p&gt;Autre élément de confort, la possibilité de rappeler sous SQL*Plus les lignes précédentes. Il faut pour cela installer le package rlwrap qui n'est pas configuré dans les dépôts pour CentOS 7.&lt;/p&gt;


&lt;p&gt;L’installation de rlwrap est un peu complexe, il faut dans un premier temps récupérer un certain nombre de packages RPM depuis l'internet, les transférer sur la VM et les installer via yum.&lt;/p&gt;
&lt;pre&gt;
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python3-3.6.8-10.el7.x86_64.rpm
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python3-setuptools-39.2.0-10.el7.noarch.rpm
wget http://mirror.centos.org/centos/7/updates/x86_64/Packages/python3-pip-9.0.3-7.el7_7.noarch.rpm
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python3-libs-3.6.8-10.el7.x86_64.rpm
wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/r/rlwrap-0.43-2.el7.x86_64.rpm
&lt;/pre&gt;

&lt;p&gt;Unre fois cette installation faite, ajouter les alias suivants dans $HOME/.bashrc ( user oracle ).&lt;/p&gt;
&lt;pre&gt;
alias sqlplus='rlwrap sqlplus'
alias rman='rlwrap rman'
alias adrci='rlwrap adrci'
&lt;/pre&gt;

&lt;p&gt;Puis sourcer le fichier&lt;/p&gt;
&lt;pre&gt;
. $HOME/.bashrc
&lt;/pre&gt;

&lt;p&gt;Une fois ces actions faites, la connexion SQL*Plus doit être opérationnelle.&lt;/p&gt;
&lt;pre&gt;
[oracle@ora01 ~]$ sqlplus /nolog

SQL*Plus: Release 19.0.0.0.0 - Production on Lun. Avr. 13 15:33:07 2020
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

@ &amp;gt;exit
&lt;/pre&gt;

&lt;h4&gt;Conclusion de l'installation&lt;/h4&gt;

&lt;p&gt;Au niveau de ce chapitre ont été vus différents points pour faciliter l'administration Oracle surtout en mode ligne de commande qui est le plus souvent l'unique moyen de se connecter à la base de données.&lt;/p&gt;


&lt;p&gt;Le chapitre suivant aborde la configuration du réseau. Une base Oracle est en effet le plus souvent accessible via des connexions distantes.&lt;/p&gt;

&lt;h3&gt;La couche Oracle*Net&lt;/h3&gt;

&lt;p&gt;Oracle*Net, anciennement SQL*Net, est la couche réseau de Oracle. Il s'agit d'une configuration de type client/serveur. Le principe est de rendre transparent pour les applications la localisation des bases de données.&lt;/p&gt;


&lt;p&gt;Les fichiers de configuration Oracle*Net peuvent être pointés par la variable d'environnement $TNS_ADMIN dont la valeur par défaut est $ORACLE_HOME/network/admin. Sous ce répertoire doivent se trouver certains fichiers dont le plus important sur un serveur se nomme listener.ora.&lt;/p&gt;


&lt;p&gt;Le schéma suivant présente la fonction Oracle*Net.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.silverlake.fr/public/oraclenet.jpg&quot; alt=&quot;oraclenet.jpg, déc. 2020&quot; /&gt;&lt;/p&gt;


&lt;h4&gt;Configuration serveur&lt;/h4&gt;

&lt;p&gt;Un processus d'écoute, le listener, écoute le réseau sur le port 1521 d'un réseau TCP/IP. Il est possible de configurer plusieurs processus d'écoute sur le même serveur; ils doivent :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Porter un nom différent&lt;/li&gt;
&lt;li&gt;Ecouter sur des ports distincts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Par convention le processus d'écoute se nomme LISTENER. Le port d'écoute 1521 est aussi une convention. Il est possible d'utiliser un autre nom et/ou un autre port d'écoute.&lt;/p&gt;


&lt;p&gt;Il est conseillé de renseigner le port d'écoute dans le fichier /etc/services.&lt;/p&gt;


&lt;p&gt;La configuration du listener se fait dans un fichier, listener.ora, situé sous $ORACLE_HOME/network/admin. C'est le seul fichier à configurer, sauf si le serveur est aussi client d'un autre serveur.&lt;/p&gt;


&lt;p&gt;Le listener se lance par la commande lsnrctl start, s'arrête avec lsnrctl stop&lt;/p&gt;


&lt;p&gt;La commande lsnrctl status permet de visualiser l'état du listener.&lt;/p&gt;


&lt;p&gt;La commande lsnrctl reload permet de recharger la configuration sans arrêt du listener.&lt;/p&gt;


&lt;p&gt;Si le serveur comporte plusieurs versions de Oracle ( 10g, 11g, 12c,... ) il faut toujours utiliser la version la plus récente du listener.&lt;/p&gt;


&lt;p&gt;La configuration du listener peut se faire de plusieurs manières. Configuration via deux programmes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Assistant netca&lt;/li&gt;
&lt;li&gt;Programme netmgr&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ces deux programmes sont graphiques. En production il est souvent plus simple d'éditer le fichier listener.ora avec vi.&lt;/p&gt;
&lt;pre&gt;
cd $ORACLE_HOME/network/admin
vi listener.ora
&lt;/pre&gt;

&lt;p&gt;Ci dessous un exemple de configuration&lt;/p&gt;
&lt;pre&gt;
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION = 
     (ADDRESS=(PROTOCOL = TCP)(HOST = ora01 )(PORT = 1521))
    )
  )
&lt;/pre&gt;

&lt;p&gt;La clause HOST peut utiliser un nom ou une IP. Dans le cas de l’utilisation d'un nom il faut au minimum renseigner celui-ci dans le fichier /etc/hosts -&amp;gt; 192.168.56.11 ora01&lt;/p&gt;


&lt;p&gt;Lancer le listener ainsi&lt;/p&gt;
&lt;pre&gt;
lsnrctl start
&lt;/pre&gt;

&lt;h4&gt;Le fichier sqlnet.ora&lt;/h4&gt;

&lt;p&gt;Ce fichier, présent également sur le serveur au même endroit que listener.ora permet une configuration poussée du mode de connexion des clients. Dans un premier temps sa mise en place sera simple. Le fichier contiendra les différentes méthodes autorisées pour se connecter.&lt;/p&gt;


&lt;p&gt;Sous $ORACLE_HOME/network/admin éditer un fichier sqlnet.ora et ajouter juste la ligne suivante :&lt;/p&gt;
&lt;pre&gt;
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
&lt;/pre&gt;

&lt;p&gt;Ici on autorise la connexion type TNS ( Transparent Network Substrate ), un fichier tnsnames.ora, devra être présent sur le client. On autorise aussi la connexion Easy Connect.&lt;/p&gt;

&lt;h4&gt;Configuration client&lt;/h4&gt;

&lt;p&gt;Elle demande la présence d'une base de données, or à ce stade aucune n'est encore en place. Toutefois afin de préparer la suite créer sous $ORACLE_HOME/network/admin un fichier nommé tnsnames.ora avec les lignes suivantes :&lt;/p&gt;
&lt;pre&gt;
LUKE =
  (DESCRIPTION =
    (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = ora01 )(PORT = 1521))
    )
    (CONNECT_DATA =
       (SERVICE_NAME = LUKE)
    ) 
)
&lt;/pre&gt;

&lt;p&gt;Comme pour la configuration listener, la clause HOST peut contenir un nom ou une IP. le fichier tnsnames.ora étant souvent sur un client oracle il importe de bien valider ce point. Le plus simple étant la gestion via un DNS.&lt;/p&gt;

&lt;h3&gt;Création d'une base de données&lt;/h3&gt;

&lt;p&gt;Il existe plusieurs méthodes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Manuellement&lt;/li&gt;
&lt;li&gt;Graphiquement avec DBCA&lt;/li&gt;
&lt;li&gt;DBCA en mode silencieux&lt;/li&gt;
&lt;li&gt;Génération de scripts via DBCA&lt;/li&gt;
&lt;li&gt;Clonage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dans ce document il sera mis en place un script shell utilisant la gestion OMF pour les fichiers.&lt;/p&gt;

&lt;h4&gt;Répertoires pour OMF&lt;/h4&gt;

&lt;p&gt;En connexion root créer les deux répertoires suivants et affecter les bons droits&lt;/p&gt;
&lt;pre&gt;
mkdir /data /fra
chown oracle:dba /data /fra
&lt;/pre&gt;

&lt;p&gt;Le répertoire /data supportera les fichiers de la base. Le répertoire /fra sera dédié à la Fast Recovery Area.&lt;/p&gt;

&lt;h4&gt;Le script de création&lt;/h4&gt;

&lt;p&gt;Ce shell comporte un certain nombre de variables qu'il suffit de personnaliser en fonction de l'environnement. Ici il sera mis en place une base nommée LUKE en utilisant la gestion OMF. Ce script est téléchargeable via l'URL suivante : http://files.silverlake.space/createLUKE.sh&lt;/p&gt;
&lt;pre&gt;
######################################################
# Shell de creation d'une base LUKE Stand-Alone
# SILVERLAKE : 10/12/2020
# Note : Deux fichiers ( initLUKE.ora et createLUKE.sql ) sont ecrits sous $HOME/sql
# Appel : createLUKE.sh
######################################################
#!/bin/bash

if [ -z ${ORACLE_BASE} ]
then
  export ORACLE_BASE=/ora01/app/oracle
fi

if [ -z ${ORACLE_HOME} ]
then
  export ORACLE_HOME=${ORACLE_BASE}/product/19/DB
  export PATH=$ORACLE_HOME/bin:$PATH
fi

export DEBUT=$(date +%s)
echo $(date)

# Variables a spécifier
export DB=LUKE
export DBUNIQ=${DB}
export ORACLE_SID=${DBUNIQ}
export DATA=/data
export FRA=/fra
export SGA=1280M
export PGA=360M
export REDOSIZE=50M
export CHARACTERSET=AL32UTF8
#export CHARACTERSET=WE8ISO8859P15
export MDP=Manager19#
export SERVEUR1=ora01

echo &amp;quot;Suppression ancienne BASE&amp;quot;
rm -rf ${DATA}/${DBUNIQ}
rm -rf ${FRA}/${DBUNIQ}

mkdir -p ${DATA}
mkdir -p ${FRA}

rm -f ${ORACLE_HOME}/dbs/*${DBUNIQ}*

echo &amp;quot;Création base Stand-Alone ${DBUNIQ} sur ${SERVEUR1}&amp;quot;

# Fichier init.ora
# A adapter selon le besoin
cat &amp;lt;&amp;lt;EOF &amp;gt; ${HOME}/sql/init${DBUNIQ}.ora
db_name=${DB}
db_unique_name=${DBUNIQ}
db_block_size=8192
db_create_file_dest=${DATA}
db_recovery_file_dest=${FRA}
db_recovery_file_dest_size=5000M
log_archive_format=${DB}_%t_%s_%r.arch
sga_target=${SGA}
pga_aggregate_target=${PGA}
EOF

# Script de creation
# A adapter, notamment dimension des tablespaces standards ( SYSTEM,SYSAUX,TEMP,UNDO,USERS )
# Le tablespace USERS est volontairement cree et bloque a 100K
cat &amp;lt;&amp;lt;EOF &amp;gt; ${HOME}/sql/create${DBUNIQ}.sql
create database ${DB}
character set ${CHARACTERSET}
national character set AL16UTF16
datafile size 500M autoextend on next 500M maxsize 2G extent management local
sysaux datafile size 500M autoextend on next 500M maxsize 2G
undo tablespace UNDOTBS1 datafile size 500M
default temporary tablespace TEMP tempfile size 500M
default tablespace USERS datafile size 100K
logfile group 1 size ${REDOSIZE},
        group 2 size ${REDOSIZE},
        group 3 size ${REDOSIZE}
user sys identified by &amp;quot;${MDP}&amp;quot;
user system identified by &amp;quot;${MDP}&amp;quot;;
EOF

ln -sfn ${HOME}/sql/init${DBUNIQ}.ora ${ORACLE_HOME}/dbs/init${DBUNIQ}.ora
orapwd file=${ORACLE_HOME}/dbs/orapw${DBUNIQ} password=${MDP}

# Creation de la base
echo &amp;quot;Création de l'instance et des fichiers principaux&amp;quot;
resultat=`sqlplus -s &amp;quot;/ as sysdba&amp;quot; &amp;lt;&amp;lt;EOF
create spfile from pfile;
startup force nomount;
start ${HOME}/sql/create${DBUNIQ}.sql;
exit;
EOF`

echo &amp;quot;Base de données ${DBUNIQ} créee. Les fichiers de contrôle sont en place.&amp;quot;

echo &amp;quot;Création des vues du dictionnaire. Phase assez longue&amp;quot;
resultat=`sqlplus -s &amp;quot;/ as sysdba&amp;quot; &amp;lt;&amp;lt;EOF
@?/rdbms/admin/catalog.sql
@?/rdbms/admin/catproc.sql

BEGIN
 FOR item IN ( SELECT USERNAME FROM DBA_USERS WHERE ACCOUNT_STATUS IN ('OPEN', 'LOCKED', 'EXPIRED') AND USERNAME NOT IN (
'SYS','SYSTEM') )
 LOOP
  dbms_output.put_line('Locking and Expiring: ' || item.USERNAME);
  execute immediate 'alter user ' ||
         sys.dbms_assert.enquote_name(
         sys.dbms_assert.schema_name(
         item.USERNAME),false) || ' password expire account lock' ;
 END LOOP;
END;
/

connect system/${MDP}
@?/sqlplus/admin/pupbld.sql
@?/sqlplus/admin/help/hlpbld.sql helpus.sql
exit;
EOF

# la base est mise en archivelog.
# Commenter ces instructions en cas de non archivelog.
`resultat=`sqlplus -s &amp;quot;/ as sysdba&amp;quot; &amp;lt;&amp;lt;EOF
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
alter system archive log current;
exit;
EOF`

echo ${DBUNIQ}':'${ORACLE_HOME}':Y' &amp;gt;&amp;gt; /etc/oratab

export FIN=$(date +%s)
echo $(date)
export DUREE=$(( ${FIN} - ${DEBUT} ))
echo &amp;quot;Fin de création. Durée -&amp;gt; ${DUREE}&amp;quot;
exit 0
&lt;/pre&gt;

&lt;p&gt;Le lancement est simple&lt;/p&gt;
&lt;pre&gt;
[oracle@ora01 ~]$ sh createLUKE.sh 
jeu.décembre 10 18:09:14 CEST 2020
Suppression ancienne BASE
Création base Stand-Alone LUKE sur ora01
Création de l'instance et des fichiers principaux
Base de données LUKE créee. Les fichiers de contrôle sont en place.
Création des vues du dictionnaire. Phase assez longue
jeu.décembre 10 18:34:21 CEST 2020
Fin de création. Durée -&amp;gt; 1507
[oracle@ora01 ~]$ 
&lt;/pre&gt;

&lt;p&gt;Ce script est largement personnalisable, commenté et explicite. Il créé une base de données avec le minimum requis pour une production :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2 fichiers de contrôle.&lt;/li&gt;
&lt;li&gt;3 groupes de redolog composé chacun de 2 membres de 50Mo&lt;/li&gt;
&lt;li&gt;1 tablespace par défaut différent ( USERS ) de SYSTEM&lt;/li&gt;
&lt;li&gt;1 tablespace temporaire&lt;/li&gt;
&lt;li&gt;1 tablespace UNDO&lt;/li&gt;
&lt;li&gt;La base est mise en archivelog.&lt;/li&gt;
&lt;li&gt;La gestion OMF permet une simplification des noms de fichiers&lt;/li&gt;
&lt;li&gt;La SGA est de 1,2Go&lt;/li&gt;
&lt;li&gt;La PGA de 360Mo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le jeu de caractères est important et paramétrable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AL32UTF8 : Caractères codés sur 4 octets&lt;/li&gt;
&lt;li&gt;WE8ISO8859P15 : Caractères codés sur 1 octet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sur la VM de test, la création a duré environ 35/40 minutes.&lt;/p&gt;

&lt;h4&gt;Enregistrement statique dans listener&lt;/h4&gt;

&lt;p&gt;Si le listener est démarré avant la base de données, celle-ci s'enregistre automatiquement  au moment de son démarrage auprès du listener.&lt;/p&gt;


&lt;p&gt;Si le listener est démarré après la base de données, le listener ne connait pas forcement la base à écouter.&lt;/p&gt;


&lt;p&gt;Il est parfois judicieux de spécifier statiquement dans la configuration du listener quelles bases il écoute. Cet enregistrement statique est obligatoire pour démarrer une base à distance.&lt;/p&gt;


&lt;p&gt;Editer le fichier $ORACLE_HOME/network/admin/listener.ora et ajouter les lignes suivantes :&lt;/p&gt;
&lt;pre&gt;
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = LUKE)
      (ORACLE_HOME = /ora01/app/oracle/product/19/DB)
      (SID_NAME = LUKE)
    )
  )
&lt;/pre&gt;

&lt;p&gt;Cette procédure est obligatoire pour démarrer une base de données depuis un poste distant. Il faut également faire ceci dans une configuration DataGuard ou la mise en place de clonage.&lt;/p&gt;


&lt;p&gt;Bien que facultatif en première approche, il est de bonne pratique de renseigner statiquement les bases dans le listener. Recharger la configuration listener ainsi.&lt;/p&gt;
&lt;pre&gt;
lsnrctl reload
&lt;/pre&gt;

&lt;h4&gt;Démarrage automatique de la base LUKE&lt;/h4&gt;

&lt;p&gt;Il est parfois intéressant que la base soit démarrée automatiquement, ou pas, au boot du serveur. Afin de prendre en charge cette fonctionnalité il faut enregistrer la base dans le fichier /etc/oratab et créer un script de lancement.&lt;/p&gt;

&lt;h5&gt;Le fichier /etc/oratab&lt;/h5&gt;

&lt;p&gt;Le fichier /etc/oratab est aussi utile afin de sélectionner la base de données sur laquelle on souhaite intervenir.&lt;/p&gt;


&lt;p&gt;La syntaxe de oratab est simple. Il contient une ligne par base de données :&lt;/p&gt;
&lt;pre&gt;
LUKE:/ora01/app/oracle/product/19/DB:Y
&lt;/pre&gt;

&lt;p&gt;Ce fichier comporte 3 champs :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le nom de la base de données&lt;/li&gt;
&lt;li&gt;La valeur de ORACLE_HOME, sur quels binaires la base doit démarrer.&lt;/li&gt;
&lt;li&gt;Y|N : La base doit ou non être démarrée au boot.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il faut être prudent avec le 3ieme champ dans le cas d'une gestion ASM. Dans ce cas les bases ne sont pas démarrées par un script mais par le Grid Infrastructure. Le champ doit donc être bien mis à 'N'.&lt;/p&gt;


&lt;p&gt;Le fichier /etc/oratab est utilisé notamment par les exécutables dbstart et dbshut ( sous $ORACLE_HOME/bin ) qui permettent de démarrer et de stopper les bases Oracle via un script.&lt;/p&gt;

&lt;h5&gt;Le script oraenv&lt;/h5&gt;

&lt;p&gt;Le fichier /etc/oratab est aussi utilisé par le script oraenv ( situé sous /usr/local/bin ) afin de permettre l'affectation correcte des variables d'environnement que sont $ORACLE_HOME et $PATH. Son utilisation est simple :&lt;/p&gt;
&lt;pre&gt;
[oracle@ora01 ~]$ . oraenv
ORACLE_SID = [oracle] ? LUKE
The Oracle base remains unchanged with value /ora01/app/oracle
[oracle@ora01 ~]$ 
&lt;/pre&gt;

&lt;p&gt;A noter que oraenv doit être &quot;sourcé&quot; et non exécuté. Il est donc possible de taper la commande ainsi :&lt;/p&gt;
&lt;pre&gt;
source oraenv
&lt;/pre&gt;

&lt;p&gt;Le script demande alors interactivement le nom de l'instance et consulte le fichier /etc/oratab afin de déterminer ORACLE_HOME.&lt;/p&gt;


&lt;p&gt;Le script oraenv peut s'appeler aussi sans intéraction, il suffit de mettre en place les variables suivantes :&lt;/p&gt;
&lt;pre&gt;
export ORAENV_ASK=NO
export ORACLE_SID=LUKE
&lt;/pre&gt;

&lt;p&gt;Cette manière de faire est intéressante si le serveur ne contient qu'une seule base de données.&lt;/p&gt;

&lt;h5&gt;Le script oraset&lt;/h5&gt;

&lt;p&gt;Ce script est tiré du livre de Darl Kuhn sur l'administation Oracle 12c.Ce script utilise aussi le fichier /etc/oratab, mais présente un menu permettant de choisir la base de données souhaitée en l'absence de paramètre passé.&lt;/p&gt;


&lt;p&gt;Se connecter en root et se positionner dans /usr/local/bin ( c'est dans ce répertoire que se trouve oraenv également ) pour créer le fichier oraset.&lt;/p&gt;
&lt;pre&gt;
#!/bin/bash
# Positionnement des variables d'environnement Oracle
# Setup: 1. A mettre sous /usr/local/bin
#        2. S'assurer de la présence de /usr/local/bin dans $PATH
# Utilisation : Mode batch : . oraset &amp;lt;SID&amp;gt;
#               Mode menu  : . oraset
#====================================================

# Le fichier oratab n'est pas sous la même arborescence si OS Linux ou Solaris. 
if [ -f /etc/oratab ]; then # Linux
  OTAB=/etc/oratab
elif [ -f /var/opt/oracle/oratab ]; then # Solaris
  OTAB=/var/opt/oracle/oratab
else
     echo 'oratab fichier non trouvé.'
     exit
fi
#
if [ -z $1 ]; then
  SIDLIST=$(egrep -v '^#|\*' ${OTAB} | cut -f1 -d:)
  # PS3 : Prompt lors de l'utilisation de la commande select dans les shell BASH.
  PS3='SID? '
  select sid in ${SIDLIST}; do
    if [ -n $sid ]; then
      HOLD_SID=$sid
      break
    fi
  done
else
  if egrep -v '^#|\*' ${OTAB} | grep -w &amp;quot;${1}:&amp;quot;&amp;gt;/dev/null; then
    HOLD_SID=$1
  else
    echo &amp;quot;SID: $1 n'existe pas dans $OTAB&amp;quot;
  fi
  shift
fi
#
export ORACLE_SID=$HOLD_SID
export ORACLE_HOME=$(egrep -v '^#|\*' $OTAB|grep -w $ORACLE_SID:|cut -f2 -d:)
export ORACLE_BASE=${ORACLE_HOME%%/product*}
export ADR_BASE=$ORACLE_BASE/diag
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
&lt;/pre&gt;

&lt;p&gt;Rendre ce script exécutable&lt;/p&gt;
&lt;pre&gt;
chmod 0755 oraset
&lt;/pre&gt;

&lt;p&gt;Ci dessous un exemple d'utilisation de oraset en interactif ou batch&lt;/p&gt;
&lt;pre&gt;
[oracle@ora01 ~]$  . oraset
1) LUKE
SID? 1

[oracle@ora01 ~]$  . oraset LUKE
&lt;/pre&gt;

&lt;h5&gt;Script de démarrage&lt;/h5&gt;

&lt;p&gt;Il faut ensuite créer un script de démarrage au boot compatible systemD. Se connecter dans une session root.&lt;/p&gt;


&lt;p&gt;Se positionner dans le répertoire /usr/lib/systemd/system et créer un fichier nommé oracle.service avec les lignes suivantes :&lt;/p&gt;
&lt;pre&gt;
[Unit]
Description=oracle
After=syslog.target
After=network.target

[Service]
Type=forking
Environment=ORACLE_HOME=/ora01/app/oracle/product/19/DB 
User=oracle 
Group=oinstall 
ExecStart=/ora01/app/oracle/product/19/DB/bin/dbstart ${ORACLE_HOME} 
ExecStop=/ora01/app/oracle/product/19/DB/bin/dbshut ${ORACLE_HOME}

[Install]
WantedBy=multi-user.target
&lt;/pre&gt;

&lt;p&gt;Ce script utilise les shell dbstart et dbshut fournis par Oracle. L'activation est classique en systemd&lt;/p&gt;
&lt;pre&gt;
systemctl enable oracle
&lt;/pre&gt;

&lt;p&gt;Attention dans le cas de l'utilisation de ASM, ce fichier ne doit pas exister. Le démarrage de la base est effectué par le Grid Infrastructure.&lt;/p&gt;

&lt;h3&gt;Diagnostics&lt;/h3&gt;

&lt;p&gt;La version 11g a introduit une nouvelle infrastructure pour le diagnostic des problèmes, Automatic Diagnostic Repository. Ces fonctions se retrouvent en 19c. ADR se présente sous la forme d'une arborescence de répertoires qui stocke de manière centralisée les données de diagnostic. Il existe 2 concepts :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les problèmes. Erreur Internes ORA-00600, OS ORA-07445...Chaque problème inclut un code ORA...et éventuellement des paramètres supplémentaires.&lt;/li&gt;
&lt;li&gt;Les incidents. Il s'agit d'une occurrence d'un problème, chaque incident porte un numéro&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L'exploitation de ADR se fait en ligne de commande par l'utilitaire adrci.&lt;/p&gt;


&lt;p&gt;ADR stocke tous les fichiers de traces et journaux pour l'ensemble des produits s'exécutant sur le serveur. BD, listener... Défini par le paramètre DIAGNOSTIC_DEST, sa valeur par défaut est $ORACLE_BASE si cette variable est définie, sinon $ORACLE_HOME/log. Le schéma suivant présente une partie de cette arborescence.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.silverlake.fr/public/arbo_adr_luke_oracle.jpg&quot; alt=&quot;arbo_adr_luke_oracle.jpg, déc. 2020&quot; /&gt;&lt;/p&gt;


&lt;p&gt;La racine de ce répertoire se nomme diag et contient un sous répertoire par produit Oracle&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;rdbms → BD, ce répertoire contient un sous répertoire par instance de base de données.&lt;/li&gt;
&lt;li&gt;tnslsnr→ listener...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Suite à la création de la base LUKE, sous $ORACLE_BASE/diag/rdbms/luke/LUKE, se trouve un certain nombre de répertoires dédiés au traces.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;luke ( en minuscules )  correspond au nom unique de la base de données ( DB_UNIQ_NAME )&lt;/li&gt;
&lt;li&gt;LUKE ( en majuscules ) au nom de l'instance ( $ORACLE_SID )&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les principaux répertoires sont :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alert : Fichier d'alerte format XML&lt;/li&gt;
&lt;li&gt;Incident : Fichiers relatifs aux incidents&lt;/li&gt;
&lt;li&gt;Trace : Fichier de trace des processus et format texte du fichier d'alerte ( alertLUKE.log ).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Oracle maintient un fichier d’alerte dans lequel il écrit des messages d’information ou d’erreurs sur la vie de la base de données :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Création de la base de données,&lt;/li&gt;
&lt;li&gt;Démarrages et arrêts,&lt;/li&gt;
&lt;li&gt;Modifications de la structure (tablespaces, fichiers de données),&lt;/li&gt;
&lt;li&gt;Erreurs internes (ORA-00600, ORA-07445),&lt;/li&gt;
&lt;li&gt;Erreurs de bloc corrompu (ORA-01578),&lt;/li&gt;
&lt;li&gt;Problèmes relatifs à l’écriture ou à l’archivage des fichiers de journalisation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En complément, lorsqu’un processus rencontre un problème, il écrit des informations dans un fichier de trace. Le fichier d'alerte est disponible sous deux formats : texte et XML. Le nom du fichier d’alerte xml est de la forme : log.xml ( sous répertoire alert ). Le nom du fichier d’alerte texte est de la forme : alert_&amp;lt;SID&amp;gt;.log ( sous répertoire trace ).&lt;/p&gt;


&lt;p&gt;Les traces ne sont pas obligatoirement des erreurs. ADR fait le distinctif entre les traces ordinaires ( switch log,... ) et les traces relatives aux incidents.&lt;/p&gt;


&lt;p&gt;Il importe de comprendre le nommage des fichiers de trace. Pour Processus d'arrière plan le nom des fichiers de trace des processus d’arrière-plan est de la forme : &amp;lt;sid&amp;gt;_&amp;lt;nom_processus&amp;gt;_&amp;lt;id_processus&amp;gt;.trc.&lt;/p&gt;


&lt;p&gt;Le nom des fichiers de trace des processus serveur est de la forme : &amp;lt;sid&amp;gt;_ora_&amp;lt;id_processus&amp;gt;.trc.&lt;/p&gt;


&lt;p&gt;Les anciens paramètres BACKGROUND_DUMP_DEST et USER_DUMP_DEST sont dépréciés.&lt;/p&gt;

&lt;h4&gt;ADRCI&lt;/h4&gt;

&lt;p&gt;Automatic Diagnostic Repository Command Interpreter. Outil ligne de commande et interactif pour gérer les erreurs Oracle. ADRCI offre diverses fonctionnalités&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visualiser le fichier alert.log&lt;/li&gt;
&lt;li&gt;Gestion des problèmes et des incidents&lt;/li&gt;
&lt;li&gt;Création de packages zippés pour envoi au support Oracle.&lt;/li&gt;
&lt;li&gt;Purge des fichiers de traces...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La version 12c introduit une nouvelle fonctionnalité permettant de tracer toute action DDL. Cette fonctionnalité n'est pas activé par défaut.&lt;/p&gt;

&lt;h4&gt;Script utile pour ADRCI&lt;/h4&gt;

&lt;p&gt;Le shell suivant propose des fonctions utiles, adrci_fct à positionner sous /usr/local/bin&lt;/p&gt;
&lt;pre&gt;
# Fonctions ADRCI utiles
# Se positione dans le répertoire des traces.
function trace {
  cd $HOME
  TRACE=$(adrci exec=&amp;quot;show homes&amp;quot; | grep $ORACLE_SID)
  cd ${ORACLE_BASE}/${TRACE}/trace
}

# L'option -d permet de visualiser en dynamique le fichier alert.log
function alerte {
  cd $HOME
  TRACE=$(adrci exec=&amp;quot;show homes&amp;quot; | grep $ORACLE_SID)
  if [ &amp;quot;$1&amp;quot; = &amp;quot;-d&amp;quot; ]; then
    adrci exec=&amp;quot;set home ${TRACE};show alert -tail -f&amp;quot;
  else
    adrci exec=&amp;quot;set home ${TRACE};show alert&amp;quot;
  fi
}

# l'option -a permet de visualiser les problèmes sur l'ensemble
function probleme {
  cd $HOME
  if [ &amp;quot;$1&amp;quot; = &amp;quot;-a&amp;quot; ]; then
    for i in $( adrci exec=&amp;quot;show homes&amp;quot; | grep -v &amp;quot;ADR Homes:&amp;quot; )
    do
      adrci exec=&amp;quot;set home ${i};show problem&amp;quot;
    done
  else
    TRACE=$(adrci exec=&amp;quot;show homes&amp;quot; | grep $ORACLE_SID)
    adrci exec=&amp;quot;set home ${TRACE};show problem&amp;quot;
  fi
}

function adrci_show_control {
  cd $HOME
  for i in $( adrci exec=&amp;quot;show homes&amp;quot; | grep $ORACLE_SID )
  do
    echo &amp;quot;SHOW CONTROL ${i}:&amp;quot;
    adrci exec=&amp;quot;set home ${i}; show control;&amp;quot;
  done
}

function adrci_set_control {
  cd $HOME
  export SHORT=168 # 1 semaine ( 7 jours )
  export LONG=720 # 1 mois ( 30 jours )
  for i in $( adrci exec=&amp;quot;show homes&amp;quot; | grep $ORACLE_SID )
  do
    echo &amp;quot;set control ${i}:&amp;quot;
    adrci exec=&amp;quot;set home ${i}; set control \(SHORTP_POLICY=${SHORT}, LONGP_POLICY=${LONG}\);&amp;quot;
  done
}

function adrci_purge_trace {
  cd $HOME
  export TEMPS=240 # 4 heures
  for i in $( adrci exec=&amp;quot;show homes&amp;quot; | grep $ORACLE_SID )
  do
    adrci exec=&amp;quot;set home ${i}; purge -age ${TEMPS}&amp;quot;
  done
}
&lt;/pre&gt;

&lt;p&gt;En cas de soucis adrci -&amp;gt; erreur : No ADR base is set. Ceci est du à une corruption ou une absence du fichier /ora01/app/oracle/product/19/DB/log/diag/adrci_dir. Ce fichier contient le chemin vers ORACLE_BASE. Sous root créer le répertoire suivant :&lt;/p&gt;
&lt;pre&gt;
mkdir -p /ora01/app/oracle/product/19/DB/log/diag
chown -R oracle:oinstall /ora01/app/oracle/product/19/DB/log
&lt;/pre&gt;

&lt;p&gt;Puis sous oracle générer ce fichier.&lt;/p&gt;
&lt;pre&gt;
printf &amp;quot;%s&amp;quot; &amp;quot;/ora01/app/oracle&amp;quot; &amp;gt; /ora01/app/oracle/product/19/DB/log/diag/adrci_dir.mif
&lt;/pre&gt;

&lt;p&gt;Afin de pouvoir utiliser adrci_fct et oraset, il suffit de rajouter les lignes suivantes dans le fichier .bash_profile du user oracle et ce sur chaque noeud.&lt;/p&gt;
&lt;pre&gt;
source /usr/local/bin/adrci_fct
source /usr/local/bin/oraset
&lt;/pre&gt;

&lt;h3&gt;Sauvegarde et restauration&lt;/h3&gt;

&lt;p&gt;&lt;q&gt;Sauvegarder à rien ne sert, si restaurer ne peut se faire.&lt;/q&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Le DBA doit&lt;/strong&gt; sauvegarder une base de données. En cas de panne,&lt;strong&gt; le DBA est obligé&lt;/strong&gt; de restaurer une base de données.&lt;/p&gt;


&lt;p&gt;La sauvegarde est une opération standard, presque banale, le plus souvent automatisée. La restauration est la plupart du temps non désirée, imprévisible, malvenue…&lt;/p&gt;


&lt;p&gt;&lt;q&gt;Tout ce qui est susceptible de mal tourner, tournera nécessairement mal. Edward Aloysius Murphy Jr.&lt;/q&gt;&lt;/p&gt;


&lt;p&gt;La sauvegarde sert essentiellement de protection contre les pannes. Il existe différentes sortes de pannes. Dans certaines situations Oracle peut remettre automatiquement la base en état. Les situations critiques sont celles où l'intervention manuelle est requise.&lt;/p&gt;


&lt;p&gt;Ici il ne sera présenté que l'outil spécialement dédié à la sauvegarde/restauration : Recovery MANager, soit RMAN.&lt;/p&gt;

&lt;h3&gt;Recovery MANager&lt;/h3&gt;

&lt;p&gt;RMAN est l'outil fournit avec Oracle pour la sauvegarde et la restauration des bases de données. Livré en standard depuis la version 8i, RMAN permet :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sauvegarde complète ou incrémentale&lt;/li&gt;
&lt;li&gt;sauvegarde partielle&lt;/li&gt;
&lt;li&gt;restauration globale ou partielle&lt;/li&gt;
&lt;li&gt;clonage de base&lt;/li&gt;
&lt;li&gt;corriger les blocs corrompus...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note sur import/export. Très utilisé comme mode de sauvegarde car simple, cet outil n'a jamais été conçu comme solution de sauvegarde et encore moins de restauration.&lt;/p&gt;


&lt;p&gt;RMAN permet de sauvegarder :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A froid → Base stoppée. On parle de sauvegarde cohérente.&lt;/li&gt;
&lt;li&gt;A chaud → base ouverte. On parle alors de sauvegarde incohérente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La sauvegarde à chaud implique un fonctionnement en mode archivelog. Sans cela RMAN génère une erreur et refuse d'effectuer la sauvegarde.&lt;/p&gt;

&lt;h4&gt;Architecture RMAN&lt;/h4&gt;

&lt;p&gt;La base à sauvegarder est appelée cible → target. La connexion à une base cible utilise la couche Oracle*Net.&lt;/p&gt;


&lt;p&gt;L'ensemble d'une sauvegarde est nommé backupset. Un backupset contient des backuppieces. Il est possible d'avoir des backuppieces d'une taille données → option maxpiecesize.&lt;/p&gt;


&lt;p&gt;Les informations sur la sauvegarde peuvent être stockées sous deux formes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dans le fichier de contrôle de la base,&lt;/li&gt;
&lt;li&gt;dans un catalogue.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L'utilisation d'un catalogue permet de centraliser la sauvegarde de bases multiples.&lt;/p&gt;


&lt;p&gt;RMAN permet également de sauvegarder les fichiers tels que → backup as copy. Le schéma suivant présente le principe de RMAN.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.silverlake.fr/public/principerman.png&quot; alt=&quot;principerman.png, déc. 2020&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Le média de stockage peut être du disque ou une bande. Il est possible de paralléliser la communication en allouant plusieurs canaux → allocate channel.&lt;/p&gt;


&lt;p&gt;Pour utiliser RMAN simplement, il est conseillé de définir une zone de récupération rapide → Fast Recovery Area ( FRA ). Mais cela n'est pas obligatoire. La FRA permet de simplifier les sauvegardes/restaurations. La base LUKE crée précédemment dispose d'une FRA, elle est également en archivelog permettant ainsi une sauvegarde à chaud.&lt;/p&gt;

&lt;h4&gt;Sauvegarde à chaud&lt;/h4&gt;

&lt;p&gt;Dans cet exemple la base sera sauvegardée sans arrêt de celle-ci.&lt;/p&gt;
&lt;pre&gt;
rman target sys/Manager19#@LUKE
RMAN&amp;gt; backup database plus archivelog delete all input;
RMAN&amp;gt; exit;
&lt;/pre&gt;

&lt;p&gt;Cette simple ligne sauvegarde l'ensemble de la base, les archivelog et les efface après sauvegarde.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;Ce billet plus long que les autres pourrait encore et encore faire l'objet de nombreux ajouts. Peut-être plus tard...&lt;/p&gt;</description>

    

      </item>
  
  <item>
    <title>Installer VirtualBox sous CentOS 7</title>
    <link>http://www.silverlake.fr/index.php?post/2020/10/02/Installer-VirtualBox-sous-CentOS-7</link>
    <guid isPermaLink="false">urn:md5:deab8b037575e0716499f14651263d4e</guid>
    <pubDate>Fri, 02 Oct 2020 15:07:00 +0200</pubDate>
    <dc:creator>Silverlake</dc:creator>
        <category>Linux</category>
        
    <description>    &lt;h3&gt;Introduction&lt;/h3&gt;

&lt;p&gt;Virtualbox est une solution très simple et gratuite de gestion des machines virtuelles. Bien que disposant d'une interface graphique, il est possible de gérer VirtualBox via la commande vboxmanage. Ce billet présente l'installation et une configuration simple de l'environnement VirtualBox sous CentOS 7.&lt;/p&gt;

&lt;h3&gt;Installation packages&lt;/h3&gt;

&lt;p&gt;Classique via yum&lt;/p&gt;
&lt;pre&gt;
yum install -y kernel-devel kernel-headers gcc make perl wget
&lt;/pre&gt;

&lt;p&gt;Charger la clé du dépots Oracle VirtualBox&lt;/p&gt;
&lt;pre&gt;
wget https://www.virtualbox.org/download/oracle_vbox.asc
rpm --import oracle_vbox.asc
&lt;/pre&gt;

&lt;p&gt;Charger le dépots des RPM VirtualBox ( il sera nécessaire de confirmer la clé )&lt;/p&gt;
&lt;pre&gt;
wget http://download.virtualbox.org/virtualbox/rpm/el/virtualbox.repo -O /etc/yum.repos.d/virtualbox.repo
&lt;/pre&gt;

&lt;p&gt;Installer VirtualBox&lt;/p&gt;
&lt;pre&gt;
yum -y install VirtualBox-6.1
&lt;/pre&gt;

&lt;h3&gt;Configuration&lt;/h3&gt;

&lt;p&gt;Dossier des VM, File Systeme dédié monté sous /VM. La commande VBoxManage peut être aussi écrite : vboxmanage&lt;/p&gt;
&lt;pre&gt;
VBoxManage setproperty machinefolder /VM
&lt;/pre&gt;

&lt;pre&gt;Vérification&lt;/pre&gt;
&lt;pre&gt;
vboxmanage list systemproperties | grep folder
Default machine folder:          /VM
&lt;/pre&gt;

&lt;p&gt;Configurer l'interface réseau interne&lt;/p&gt;
&lt;pre&gt;
vboxmanage hostonlyif create
vboxmanage hostonlyif ipconfig vboxnet0 --ip 192.168.56.1
&lt;/pre&gt;

&lt;p&gt;Vérification&lt;/p&gt;
&lt;pre&gt;
vboxmanage list hostonlyifs
Name:            vboxnet0
GUID:            786f6276-656e-4074-8000-0a0027000000
DHCP:            Disabled
IPAddress:       192.168.56.1
NetworkMask:     255.255.255.0
IPV6Address:     
IPV6NetworkMaskPrefixLength: 0
HardwareAddress: 0a:00:27:00:00:00
MediumType:      Ethernet
Wireless:        No
Status:          Up
VBoxNetworkName: HostInterfaceNetworking-vboxnet0
&lt;/pre&gt;

&lt;p&gt;Désactiver le DHCP sur vboxnet0&lt;/p&gt;
&lt;pre&gt;
vboxmanage dhcpserver remove --ifname vboxnet0
vboxmanage list dhcpservers
&lt;/pre&gt;

&lt;p&gt;Importer une VM, fichier .ova&lt;/p&gt;
&lt;pre&gt;
vboxmanage import DOK01.ova
&lt;/pre&gt;

&lt;p&gt;Démarrer la VM sans la console&lt;/p&gt;
&lt;pre&gt;
VboxManage startvm DOK01 --type headless
&lt;/pre&gt;

&lt;p&gt;La liste des options VboxManage via ce lien : https://www.virtualbox.org/manual/ch08.html&lt;/p&gt;</description>

    

      </item>
  
  <item>
    <title>Synchronisation horaire Cluster RAC Oracle</title>
    <link>http://www.silverlake.fr/index.php?post/2020/03/04/Synchronisation-horaire-Cluster-RAC-Oracle</link>
    <guid isPermaLink="false">urn:md5:2e7b9f50fac8717767ce98d642ab1cda</guid>
    <pubDate>Wed, 04 Mar 2020 09:18:00 +0100</pubDate>
    <dc:creator>Silverlake</dc:creator>
        <category>Oracle</category>
        
    <description>    &lt;h3&gt;Introduction&lt;/h3&gt;

&lt;p&gt;La synchronisation horaire est vitale dans un cluster RAC. L'éviction de noeud peut être générée en cas de différence. Par défaut Oracle  utilise NTP pour assurer la synchronisation horaire. Toutefois il est possible de laisser le cluster gérer ceci via CTSS. Ce billet présente l'activation de CTSS sur des serveurs Red Hat&lt;/p&gt;

&lt;h3&gt;CTSS&lt;/h3&gt;

&lt;p&gt;Cluster Time Synchronization Services. Par défaut il est en mode Observer. lancer la commande suivante en tant que user grid.&lt;/p&gt;
&lt;pre&gt;
crsctl check ctss 
CRS-4700: The Cluster Time Synchronization Service is in Observer mode.
&lt;/pre&gt;

&lt;p&gt;Afin de le faire passer en mode Active, il faut désactiver totalement NTP. Red Hat 7 utilise chrony pour la synchronisation horaire, dans certains cas l'ancien démon ntp est toujours utilisé. Sur chaque noeud deconfigurer ntp et chrony ( en tant que root )&lt;/p&gt;
&lt;pre&gt;
mv /etc/chrony.conf /etc/chrony.conf.old
mv /etc/ntp.conf /etc/ntp.conf.old
systemctl stop chronyd
systemctl disable chronyd
systemctl stop ntpd
systemctl disable ntpd
&lt;/pre&gt;

&lt;p&gt;En tant que user grid  valider l'activiation de CTSS&lt;/p&gt;
&lt;pre&gt;
crsctl check ctss
CRS-4701: The Cluster Time Synchronization Service is in Active mode.
CRS-4702: Offset (in msec): 0
&lt;/pre&gt;

&lt;p&gt;Validation de la synchronisation de tous les noeuds&lt;/p&gt;
&lt;pre&gt;
cluvfy comp clocksync -n all -verbose

Verifying Clock Synchronization across the cluster nodes

Checking if Clusterware is installed on all nodes...
Oracle Clusterware is installed on all nodes.

Checking if CTSS Resource is running on all nodes...
Check: CTSS Resource running on all nodes
  Node Name                             Status
  ------------------------------------  ------------------------
  rac01                                      passed
  rac02                                      passed
CTSS resource check passed

Querying CTSS for time offset on all nodes...
Query of CTSS for time offset passed

Check CTSS state started...
Check: CTSS state
  Node Name                             State
  ------------------------------------  ------------------------
  rac01                                             Active
  rac02                                             Active
CTSS is in Active state. Proceeding with check of clock time offsets on all nodes...
Reference Time Offset Limit: 1000.0 msecs
Check: Reference Time Offset
  Node Name     Time Offset               Status
  ------------  ------------------------  ------------------------
  rac01           0.0                       passed
  rac02           0.0                       passed

Time offset is within the specified limits on the following set of nodes:
&amp;quot;[rac01, rac02]&amp;quot;
Result: Check of clock time offsets passed

Oracle Cluster Time Synchronization Services check passed
Verification of Clock Synchronization across the cluster nodes was successful.
&lt;/pre&gt;</description>

    

      </item>
  
  <item>
    <title>Serveur physique ou virtuel</title>
    <link>http://www.silverlake.fr/index.php?post/2020/01/28/Serveur-physique-ou-virtuel</link>
    <guid isPermaLink="false">urn:md5:211f05b42760014676e73406787a036d</guid>
    <pubDate>Tue, 28 Jan 2020 14:40:00 +0100</pubDate>
    <dc:creator>Silverlake</dc:creator>
        <category>Linux</category>
        
    <description>    &lt;p&gt;Comment savoir si la machine sur laquelle on travaille est un vrai serveur ou une machine virtuelle. Il existe plusieurs méthodes. Il faut disposer d'un accès root ou via sudo.&lt;/p&gt;


&lt;p&gt;Installer les packages dmidecode et facter&lt;/p&gt;
&lt;pre&gt;
yum -y install dmidecode facter
&lt;/pre&gt;

&lt;p&gt;Par la commande dmidecode&lt;/p&gt;
&lt;pre&gt;
dmidecode -s system-manufacturer
HP
&lt;/pre&gt;

&lt;p&gt;Il s'agit certainement d'un serveur physique&lt;/p&gt;
&lt;pre&gt;
dmidecode -s system-manufacturer
VMware, Inc.
&lt;/pre&gt;

&lt;p&gt;Machine virtuelle VmWare&lt;/p&gt;


&lt;p&gt;Par la commande facter&lt;/p&gt;
&lt;pre&gt;
facter virtual
physical
&lt;/pre&gt;

&lt;p&gt;Physique&lt;/p&gt;
&lt;pre&gt;
facter virtual
vmware
&lt;/pre&gt;

&lt;p&gt;Machine virtuelle&lt;/p&gt;</description>

    

      </item>
  
  <item>
    <title>Red Hat/CentOS 7 , perte du mot de passe root</title>
    <link>http://www.silverlake.fr/index.php?post/2020/01/24/RedHat/CentOS-7-%2C-perte-du-mot-de-passe-root</link>
    <guid isPermaLink="false">urn:md5:b578a66d0757da74dd9a17b748487349</guid>
    <pubDate>Fri, 24 Jan 2020 08:35:00 +0100</pubDate>
    <dc:creator>Silverlake</dc:creator>
        <category>Linux</category>
        
    <description>    &lt;p&gt;Depuis la version 7 de Red Hat/CentOS la procédure de changement en cas de perte du mot de passe root a changé. Pour ce faire, il faut disposer d' un accès console.&lt;/p&gt;


&lt;p&gt;Redémarrer la machine et interrompre le chargeur GRUB par la touche « e ».&lt;/p&gt;


&lt;p&gt;Se déplacer sur la ligne contenant /boot/vmlinuz…
Remplacer la chaine « ro » par la chaine suivante :&lt;/p&gt;
&lt;pre&gt;
rw init=/sysroot/bin/sh
&lt;/pre&gt;

&lt;p&gt;Attention clavier qwerty !!! ( le &quot;/&quot; est le &quot;!&quot;, le &quot;w&quot; est le &quot;z&quot; et le &quot;a&quot; est le &quot;q&quot; )&lt;/p&gt;


&lt;p&gt;Appuyer sur « ctrl » + « x » pour démarrer&lt;/p&gt;


&lt;p&gt;Une invite s’affiche alors sans besoin de mot de passe. Normalement le clavier est devenu azerty. Isoler la partition /sysroot&lt;/p&gt;
&lt;pre&gt;
chroot /sysroot
&lt;/pre&gt;

&lt;p&gt;Changer le mot de passe de root&lt;/p&gt;
&lt;pre&gt;
passwd root
&lt;/pre&gt;

&lt;p&gt;Mettre à jour selinux&lt;/p&gt;
&lt;pre&gt;
touch /.autorelabel
&lt;/pre&gt;

&lt;p&gt;Quitter chroot&lt;/p&gt;
&lt;pre&gt;
exit
&lt;/pre&gt;

&lt;p&gt;Relancer le système&lt;/p&gt;
&lt;pre&gt;
reboot
&lt;/pre&gt;</description>

    

      </item>
  
  <item>
    <title>Récupérer les enregistrements type A d'une zone DNS</title>
    <link>http://www.silverlake.fr/index.php?post/2019/09/13/R%C3%A9cup%C3%A9rer-les-enregistrements-type-A-d-une-zone-DNS</link>
    <guid isPermaLink="false">urn:md5:ce7e6d63780690ca56f9312f6b1abe24</guid>
    <pubDate>Fri, 13 Sep 2019 14:48:00 +0200</pubDate>
    <dc:creator>Silverlake</dc:creator>
        <category>Linux</category>
        
    <description>    &lt;p&gt;Utilisation de la commande dig&lt;/p&gt;
&lt;pre&gt;
dig -tAXFR formation.maison

; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.9.4-RedHat-9.9.4-72.el7 &amp;lt;&amp;lt;&amp;gt;&amp;gt; -tAXFR formation.maison
;; global options: +cmd
formation.maison.	38400	IN	SOA	ns.formation.maison. root.formation.maison. 2019071901 3600 3600 604800 86400
formation.maison.	38400	IN	NS	ns.formation.maison.
ans01.formation.maison.	38400	IN	CNAME	ns.formation.maison.
lux01.formation.maison.	38400	IN	A	192.168.56.41
lux02.formation.maison.	38400	IN	A	192.168.56.42
lux03.formation.maison.	38400	IN	A	192.168.56.43
ns.formation.maison.	38400	IN	A	192.168.56.31
web01.formation.maison.	38400	IN	A	192.168.56.51
web02.formation.maison.	38400	IN	A	192.168.56.52
formation.maison.	38400	IN	SOA	ns.formation.maison. root.formation.maison. 2019071901 3600 3600 604800 86400
;; Query time: 2 msec
;; SERVER: 192.168.56.31#53(192.168.56.31)
;; WHEN: ven. sept. 13 14:47:46 CEST 2019
;; XFR size: 10 records (messages 1, bytes 274)
&lt;/pre&gt;

&lt;p&gt;Utilisation des commande Linux pour récupérer les enregistrements A.&lt;/p&gt;
&lt;pre&gt;
dig -tAXFR formation.maison | egrep -v '^;' | sed 's/\s/\|/g' | grep 'IN|A' | cut -d'|' -f1

lux01.formation.maison.
lux02.formation.maison.
lux03.formation.maison.
ns.formation.maison.
web01.formation.maison.
web02.formation.maison.
&lt;/pre&gt;</description>

    

      </item>
  
  <item>
    <title>Exporter des données depuis une standby database</title>
    <link>http://www.silverlake.fr/index.php?post/2019/06/05/Exporter-des-donn%C3%A9es-depuis-une-standby-database</link>
    <guid isPermaLink="false">urn:md5:58a6ce9ea6beafbaa933dbac7dd71013</guid>
    <pubDate>Wed, 05 Jun 2019 08:58:00 +0200</pubDate>
    <dc:creator>Silverlake</dc:creator>
        <category>Oracle</category>
        
    <description>    &lt;h3&gt;Introduction&lt;/h3&gt;

&lt;p&gt;Dans une configuration dataguard il est intéressant d'utiliser la base standby pour procéder à un export. Ceci permet d'éviter une surcharge de la base primaire. Il faut toutefois différentier deux cas selon l'outil utilisé.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EXP : Déprécié certes mais encore très utilisé.&lt;/li&gt;
&lt;li&gt;EXPDP : Datapump, la solution depuis la version 10g de Oracle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Une standby database est soit en mode recouvrement ( mount ) ou en read only ( Active Dataguard ). EXP peut fonctionner sur une base en read only, ce qui n'est pas le cas de EXPDP qui doit écrire dans une table de la base.
Dans tous les cas il est nécessaire de stopper le processus  MRP ( Apply ). Le billet suivant se base sur une version 12c de Oracle.&lt;/p&gt;

&lt;h3&gt;Arrêt du processus MRP&lt;/h3&gt;

&lt;p&gt;Se connecter sur la standby database et lancer la commande suivante :&lt;/p&gt;
&lt;pre&gt;
alter database recover managed standby database cancel;
&lt;/pre&gt;

&lt;p&gt;En cas de configuration broker, utiliser DGMGRL et la commande suivante :&lt;/p&gt;
&lt;pre&gt;
edit database STDBY set state='APPLY-OFF';
&lt;/pre&gt;

&lt;h3&gt;Utilisation de EXP&lt;/h3&gt;

&lt;p&gt;Se connecter sur la standby database et lancer la commande suivante :&lt;/p&gt;
&lt;pre&gt;
alter database open read only;
&lt;/pre&gt;

&lt;p&gt;Procéder ensuite à l'export classique. Une fois l'export terminé réactiver le recouvrement.&lt;/p&gt;
&lt;pre&gt;
shutdown immediate;
startup mount;
&lt;/pre&gt;

&lt;p&gt;Réactiver MRP. Si le broker n'est pas utilisé, via SQL*Plus :&lt;/p&gt;
&lt;pre&gt;
alter database recover managed standby database using current logfile disconnect;
&lt;/pre&gt;

&lt;p&gt;Si le broker est en place via DGMGRL&lt;/p&gt;
&lt;pre&gt;
edit database STDBY set state='APPLY-ON';
&lt;/pre&gt;

&lt;h3&gt;Utilisation de EXPDP ( Datapump )&lt;/h3&gt;

&lt;p&gt;La base standby doit être ouverte en mode read write. Il faut donc dans un premier temps la transformer en snapshot database. Il faut également activer le mode flashback  ( Fast Recovery Area obligatoire ) et passer la gestion des fichiers en manuel. Se connecter à la standby et passer les commandes suivantes :&lt;/p&gt;
&lt;pre&gt;
alter system set standby_file_management=manual;
alter database flashback on;
alter database convert to snapshot database;
alter database open;
&lt;/pre&gt;

&lt;p&gt;A ce stade la base est en mode read write. Procéder à l'export via expdp. En fin d'exécution réactiver la standby database.&lt;/p&gt;
&lt;pre&gt;
shutdown immediate;
startup mount;
alter system set standby_file_management=auto;
alter database flashback off;
alter database convert to physical standby;
&lt;/pre&gt;

&lt;p&gt;La dernière étape est de réactiver le recouvrement. Si le broker n'est pas utilisé, via SQL*Plus :&lt;/p&gt;
&lt;pre&gt;
alter database recover managed standby database using current logfile disconnect;
&lt;/pre&gt;

&lt;p&gt;Si le broker est en place via DGMGRL&lt;/p&gt;
&lt;pre&gt;
edit database STDBY set state='APPLY-ON';
&lt;/pre&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;Il existe une autre solution qui consiste à créer un database link depuis la base primaire vers la standby et de procéder à un export datapump via ce database link. Il y a toutefois  un problème avec cette solution si la base utilise des champs LONG qui ne peuvent être exportés via un database link.&lt;/p&gt;</description>

    

      </item>
  
  <item>
    <title>Modification informations avec DataPump</title>
    <link>http://www.silverlake.fr/index.php?post/2019/03/13/Modification-informations-avec-DataPump</link>
    <guid isPermaLink="false">urn:md5:e53668b4e7dfb76db3d1e424069a02d0</guid>
    <pubDate>Wed, 13 Mar 2019 16:27:00 +0100</pubDate>
    <dc:creator>Silverlake</dc:creator>
        <category>Oracle</category>
        
    <description>    &lt;h3&gt;Introduction&lt;/h3&gt;

&lt;p&gt;Il est parfois souhaitable lors d'un export par DataPump de modifier certaines données dites confidentielles. Un bon exemple est un numéro de carte bancaire ou de sécurité sociale. Ce billet présente l'option remap_data de la commande expdp qui permet cette transformation.&lt;/p&gt;


&lt;p&gt;La syntaxe pour utiliser remap_data est la suivante :&lt;/p&gt;
&lt;pre&gt;
remap_data=schema.table.colonne:schema.package.fonction
&lt;/pre&gt;

&lt;h3&gt;Mise en place&lt;/h3&gt;

&lt;p&gt;Dans un premier temps créer deux utilisateurs sur la base Oracle avec les droits ad hoc.&lt;/p&gt;
&lt;pre&gt;
-- On utilise la gestion OMF
create tablespace data_test;
-- Objet directory pour datapump
create directory dpump as '/home/oracle/dpump';
-- Utilisateurs
create user alice identified by ecila default tablespace data_test quota unlimited on data_test;
grant connect, resource to alice;
grant read, write on directory dpump to alice;
create user bob identified by robert default tablespace data_test quota unlimited on data_test;
grant connect resource to bob;
grant read, write on directory dpump to bob;
&lt;/pre&gt;

&lt;p&gt;Se connecter alice sur la base&lt;/p&gt;
&lt;pre&gt;
-- Connexion alice
connect alice/ecila
create table t1 ( code number, cb number );
insert into t1 values (1,123456);
insert into t1 values (2,789012);
insert into t1 values (3,345678);
commit;
-- Creation de la fonction de transformation
create or replace package transform as
  function trans_cb ( cb in number) return number;
end;
/
create or replace package body transform as
  function trans_cb ( cb in number) return number as changed_value number;
begin
  changed_value := round(dbms_random.value(100000,999999));
  return changed_value;
end;
/
&lt;/pre&gt;

&lt;p&gt;Il est possible de tester la transformation ainsi :&lt;/p&gt;
&lt;pre&gt;
select transform.trans_cb(123456) from dual;
658794
&lt;/pre&gt;

&lt;p&gt;Lancement de l'export datapump&lt;/p&gt;
&lt;pre&gt;
expdp alice/ecila directory=dpump dumpfile=t1.dpump logfile=t1.dpimp.log tables=alice.t1 remap_data=alice.t1.cb:alice.transform.trans_cb
&lt;/pre&gt;

&lt;p&gt;Puis procéder à l'import datapump dans le schéma de Bob.&lt;/p&gt;
&lt;pre&gt;
 impdp bob/robert directory=dpump dumpfile=test.dpump logfile=test.dpimp.log remap_schema=alice:bob table_exists_action=replace
&lt;/pre&gt;

&lt;p&gt;Se connecter à la base pour vérifier&lt;/p&gt;
&lt;pre&gt;
select * from alice.t1;

      CODE         CB
---------- ----------
         1     123456
         2     789012
         3     345678

select * from bob.t1;

      CODE         CB
---------- ----------
         1     461025
         2     638644
         3     462037
&lt;/pre&gt;

&lt;p&gt;Les données ont bien été modifiées.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;La fonction de transformation présentée est simple et facilement adaptable.&lt;/p&gt;</description>

    

      </item>
  
  <item>
    <title>Réplication de données Oracle avec Streams</title>
    <link>http://www.silverlake.fr/index.php?post/2019/01/10/R%C3%A9plication-de-donn%C3%A9es-Oracle-avec-Streams.</link>
    <guid isPermaLink="false">urn:md5:7f37dd8e6044ea13ef33854aa91fdd88</guid>
    <pubDate>Thu, 10 Jan 2019 15:01:00 +0100</pubDate>
    <dc:creator>Silverlake</dc:creator>
        <category>Oracle</category>
        
    <description>    &lt;h3&gt;Introduction&lt;/h3&gt;

&lt;p&gt;Streams n'a pas une très bonne réputation auprès des DBA Oracle, toutefois si l'on souhaite mettre de manière simple et peu onéreuse une réplication de données entre deux serveurs, cette solution n'est pas dénuée d'intérêt.&lt;/p&gt;


&lt;p&gt;Oracle déconseille Streams au profit de GoldenGate ( coût supplémentaire ). Streams ne demande pas de licence ce qui est intéressant pour les petits budgets. L'objectif ici est de présenter la mise en place d'une réplication STREAMS entre deux bases Oracle 12c. L'exemple porte sur la réplication bi-directionnelle d'un schéma nommé ALICE entre deux bases de données RED et BLACK.&lt;/p&gt;


&lt;p&gt;La base RED est sur le serveur srv1 et la base BLACK sur srv2. La version de Oracle est la 12.1.0.2. L'exemple est toutefois applicable dans les versions antérieures.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.silverlake.fr/public/replication_streams_red_black_blog.jpg&quot; alt=&quot;replication_streams_red_black_blog.jpg&quot; title=&quot;replication_streams_red_black_blog.jpg, janv. 2019&quot; /&gt;&lt;/p&gt;


&lt;p&gt;La gestion de streams est un livre à elle seule, cet exemple ne montre pas toutes les possibilités, notamment la gestion des conflits.&lt;/p&gt;


&lt;h3&gt;Principe de STREAMS&lt;/h3&gt;

&lt;p&gt;Le principe est simple :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Capture des ordres sur la base source&lt;/li&gt;
&lt;li&gt;Propagation vers la base cible&lt;/li&gt;
&lt;li&gt;Application des ordres sur la base cible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les composants STREAMS à mettre en place sont :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;File ou queue d'envoi et de réception&lt;/li&gt;
&lt;li&gt;Processus de capture, de propagation et d'application&lt;/li&gt;
&lt;li&gt;Database links&lt;/li&gt;
&lt;li&gt;User dédié à la supervision STREAMS -&amp;gt; strmadmin&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Pré-requis&lt;/h3&gt;

&lt;p&gt;Les bases doivent être en archivelog, le supplemental logging minimum en place et activer le mode force logging. Les requêtes suivantes doivent être passées sur les deux bases RED et BLACK.&lt;/p&gt;
&lt;pre&gt;
select log_mode from v$database;

LOG_MODE
------------------------------------
ARCHIVELOG

select supplemental_log_data_min Min, supplemental_log_data_pk PK, 
supplemental_log_data_ui UI, supplemental_log_data_fk FK from v$database; 

MIN            PK        UI        FK
-------------- --------- --------- ---------
NO             NO        NO        NO

alter database add supplemental log data;

select supplemental_log_data_min Min, supplemental_log_data_pk PK, 
supplemental_log_data_ui UI, supplemental_log_data_fk FK from v$database;

MIN            PK        UI        FK
-------------- --------- --------- ---------
YES            NO        NO        NO

select force_logging from v$database;

FORCE_LOGGING
---------------
NO

alter database force logging;

select force_logging from v$database;

FORCE_LOGGING
---------------
YES
&lt;/pre&gt;

&lt;h3&gt;User dédié STREAMS&lt;/h3&gt;

&lt;p&gt;Il est conseillé de créer un compte avec les droits DBA chargé de la supervision STREAMS. Ces actions sont à effectuer sur les deux bases.&lt;/p&gt;
&lt;pre&gt;
create tablespace data_streams;
create temporary tablespace temp_streams;
create user strmadmin identified by strmadmin default tablespace data_streams temporary tablespace temp_streams 
quota unlimited on data_streams;
grant dba, select_catalog_role to strmadmin;
execute dbms_streams_auth.grant_admin_privilege('STRMADMIN',TRUE);
&lt;/pre&gt;

&lt;h3&gt;Configuration Oracle*Net&lt;/h3&gt;

&lt;p&gt;C'est un élément important dans la réplication STREAMS. Outre la résolution correcte via tnsnames il faut qu'au niveau de chaque base le paramètre global_names soit à TRUE.&lt;/p&gt;
&lt;pre&gt;
show parameter global_names;

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
global_names                         boolean                           FALSE

alter system set global_names=true scope=both;

show parameter global_names;

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
global_names                         boolean                           TRUE
&lt;/pre&gt;

&lt;h3&gt;Création des DBLINKS&lt;/h3&gt;

&lt;p&gt;La création des database links doit être rigoureuse. Il est impératif que le nom des DBLINKS soit identique au nom de la base de données en raison de global_names = true.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Base BLACK, connexion en strmadmin&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
create database link red connect to strmadmin identified by strmadmin using 'RED';

select * from global_name@red;

GLOBAL_NAME
--------------
RED
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Base RED, connexion en strmadmin&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
create database link black connect to strmadmin identified by strmadmin using 'BLACK';

select * from global_name@black;

GLOBAL_NAME
--------------
BLACK
&lt;/pre&gt;

&lt;p&gt;Ci dessous la configuration tnsnames.ora&lt;/p&gt;
&lt;pre&gt;
RED=
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = srv1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = RED)
    )
  )

BLACK=
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = srv2)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = BLACK)
    )
  )
&lt;/pre&gt;

&lt;h3&gt;Création du user ALICE&lt;/h3&gt;

&lt;p&gt;A faire sur les deux bases RED et BLACK.&lt;/p&gt;
&lt;pre&gt;
create tablespace data_alice;
create temporary tablespace temp_alice;
create user alice identified by ecila default tablespace data_alice temporary tablespace temp_alice quota unlimited on data_alice;
grant connect,resource to alice;
&lt;/pre&gt;

&lt;p&gt;Uniquement sur la base RED créer des données pour le user ALICE&lt;/p&gt;
&lt;pre&gt;
connect alice/ecila
create table compositeur ( nocomp number(2), prenom varchar2(15 char), nom varchar2(15 char ), naissance date, deces date, constraint pk_compositeur primary key (nocomp) );
insert into compositeur values( 1,'Frédéric','Chopin', to_date('01/03/1810','DD/MM/YYYY'),to_date('17/10/1849','DD/MM/YYYY'));
insert into compositeur values( 2,'Hector','Berlioz', to_date('11/12/1803','DD/MM/YYYY'),to_date('08/03/1869','DD/MM/YYYY'));
insert into compositeur values( 3,'Franz','Liszt', to_date('22/10/1811','DD/MM/YYYY'),to_date('31/07/1886','DD/MM/YYYY'));
insert into compositeur values( 4,'Michel','Legrand', to_date('24/02/1932','DD/MM/YYYY'),null);
insert into compositeur values( 5,'Marin','Marais', to_date('31/05/1656','DD/MM/YYYY'),to_date('15/08/1728','DD/MM/YYYY'));
insert into compositeur values( 6,'Pierre','Boulez', to_date('26/03/1925','DD/MM/YYYY'),to_date('05/01/2016','DD/MM/YYYY'));
insert into compositeur values( 7,'Jean-Michel','Jarre', to_date('24/08/1948','DD/MM/YYYY'),null);
commit;
&lt;/pre&gt;

&lt;p&gt;A ce stade la configuration de base et les pré-requis sont en place. Les manipulations suivantes doivent se faire de manière symétrique, en modifiant certaines clauses, sur les deux bases. Pour toutes les actions utiliser le compte STRMADMIN et non SYSDBA.&lt;/p&gt;

&lt;h3&gt;Réplication STREAMS du schéma ALICE&lt;/h3&gt;

&lt;p&gt;Le diagramme suivant présente l'architecture générale de la réplication bi-directionnelle.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.silverlake.fr/public/.red_black_streams_m.jpg&quot; alt=&quot;red_black_streams.jpg&quot; title=&quot;red_black_streams.jpg, janv. 2019&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Du fait de la symétrie de la réplication, il faut être attentif lors des créations des éléments streams à bien spécifier les clauses qui diffèrent.&lt;/p&gt;

&lt;h3&gt;Création des queues&lt;/h3&gt;

&lt;p&gt;Se connecter strmadmin/strmadmin sur chaque base avant la création des queues. Les requêtes sont identiques sur les deux bases.&lt;/p&gt;


&lt;p&gt;Création de la file d'envoi.&lt;/p&gt;
&lt;pre&gt;
begin
  dbms_streams_adm.set_up_queue(
  queue_table =&amp;gt; 'ENVOI_ALICE',
  queue_name =&amp;gt; 'ENVOI_ALICE',
  queue_user =&amp;gt; 'STRMADMIN');
end;
/
&lt;/pre&gt;

&lt;p&gt;Création de la file de réception&lt;/p&gt;
&lt;pre&gt;
begin
  dbms_streams_adm.set_up_queue(
  queue_table =&amp;gt; 'RECEPTION_ALICE',
  queue_name =&amp;gt; 'RECEPTION_ALICE',
  queue_user =&amp;gt; 'STRMADMIN');
end;
/
&lt;/pre&gt;

&lt;p&gt;Vérification&lt;/p&gt;
&lt;pre&gt;
select name from dba_queues where owner='STRMADMIN'

NAME
------------------------------
RECEPTION_ALICE
AQ$_RECEPTION_ALICE_E
ENVOI_ALICE
AQ$_ENVOI_ALICE_E
&lt;/pre&gt;

&lt;p&gt;Les queues type AQ$ sont automatiquement mises en place pour gérer les exceptions ( non utilisées dans ce test ).&lt;/p&gt;

&lt;h3&gt;Création des captures&lt;/h3&gt;

&lt;p&gt;Les captures sont à mettre en place sur les deux bases. Attention certaines clauses diffèrent selon la base concernée.&lt;/p&gt;

&lt;h4&gt;Base RED&lt;/h4&gt;

&lt;p&gt;La capture se fait sur le schéma ALICE.&lt;/p&gt;
&lt;pre&gt;
begin
  dbms_streams_adm.add_schema_rules(
    schema_name =&amp;gt; 'ALICE',
    streams_type =&amp;gt; 'capture',
    streams_name =&amp;gt; 'CAPTURE_ALICE',
    queue_name =&amp;gt; 'ENVOI_ALICE',
    include_dml =&amp;gt; true,
    include_ddl =&amp;gt; true,
    inclusion_rule =&amp;gt; true);
  end;
/
&lt;/pre&gt;

&lt;h4&gt;Base BLACK&lt;/h4&gt;

&lt;p&gt;La création est identique à la précédente, sauf la clause inclusion_rule.&lt;/p&gt;
&lt;pre&gt;
begin
  dbms_streams_adm.add_schema_rules(
    schema_name =&amp;gt; 'ALICE',
    streams_type =&amp;gt; 'capture',
    streams_name =&amp;gt; 'CAPTURE_ALICE',
    queue_name =&amp;gt; 'ENVOI_ALICE',
    include_dml =&amp;gt; true,
    include_ddl =&amp;gt; true );
  end;
/
&lt;/pre&gt;

&lt;h3&gt;Création des propagations&lt;/h3&gt;

&lt;p&gt;Une fois les captures faites, il faut envoyer les informations STREAMS vers l'autre base. Cette action est gérée par les propagations. Suite à leur création les propagations sont automatiquement démarrées.
Depuis la base RED on envoie vers la queue de réception ( RECEPTION_ALICE ) de la base BLACK et réciproquement.&lt;/p&gt;

&lt;h4&gt;Base RED&lt;/h4&gt;
&lt;pre&gt;
begin
  dbms_streams_adm.add_schema_propagation_rules(
    schema_name =&amp;gt; 'ALICE',
    streams_name =&amp;gt; 'prop_red_to_black',
    source_queue_name =&amp;gt; 'ENVOI_ALICE',
    destination_queue_name =&amp;gt; 'RECEPTION_ALICE@BLACK',
    include_dml =&amp;gt; true,
    include_ddl =&amp;gt; true,
    source_database =&amp;gt; 'RED');
end;
/
&lt;/pre&gt;

&lt;h4&gt;Base BLACK&lt;/h4&gt;
&lt;pre&gt;
begin
  dbms_streams_adm.add_schema_propagation_rules(
    schema_name =&amp;gt; 'ALICE',
    streams_name =&amp;gt; 'prop_black_to_red',
    source_queue_name =&amp;gt; 'ENVOI_ALICE',
    destination_queue_name =&amp;gt; 'RECEPTION_ALICE@RED',
    include_dml =&amp;gt; true,
    include_ddl =&amp;gt; true,
    source_database =&amp;gt; 'BLACK');
end;
/
&lt;/pre&gt;

&lt;h3&gt;Création des applications&lt;/h3&gt;

&lt;p&gt;Une fois les données reçues sur la base de destination il faut les appliquer.&lt;/p&gt;

&lt;h4&gt;Base RED&lt;/h4&gt;
&lt;pre&gt;
begin
  dbms_streams_adm.add_schema_rules(
    schema_name=&amp;gt;'ALICE',
    streams_type=&amp;gt;'apply',
    streams_name=&amp;gt;'APPLY_ALICE',
    queue_name=&amp;gt;'RECEPTION_ALICE',
    include_dml=&amp;gt;true,
    include_ddl=&amp;gt;true,
    source_database=&amp;gt;'BLACK'
  );
end;
/
&lt;/pre&gt;

&lt;p&gt;Il peut être intéressant de ne pas stopper le processus d'application en cas d'erreur, ce qui est la configuration par défaut. Procéder ainsi :&lt;/p&gt;
&lt;pre&gt;
begin
  dbms_apply_adm.set_parameter(
    apply_name  =&amp;gt; 'APPLY_ALICE', 
    parameter   =&amp;gt; 'disable_on_error', 
    value       =&amp;gt; 'n');
end;
/
&lt;/pre&gt;

&lt;h4&gt;Base BLACK&lt;/h4&gt;
&lt;pre&gt;
begin
  dbms_streams_adm.add_schema_rules(
    schema_name=&amp;gt;'ALICE',
    streams_type=&amp;gt;'apply',
    streams_name=&amp;gt;'APPLY_ALICE',
    queue_name=&amp;gt;'RECEPTION_ALICE',
    include_dml=&amp;gt;true,
    include_ddl=&amp;gt;true,
    source_database=&amp;gt;'RED'
  );
end;
/
&lt;/pre&gt;

&lt;p&gt;Il peut être intéressant de ne pas stopper le processus d'application en cas d'erreur, ce qui est la configuration par défaut. Procéder ainsi :&lt;/p&gt;
&lt;pre&gt;
begin
  dbms_apply_adm.set_parameter(
    apply_name  =&amp;gt; 'APPLY_ALICE', 
    parameter   =&amp;gt; 'disable_on_error', 
    value       =&amp;gt; 'n');
end;
/
&lt;/pre&gt;

&lt;h3&gt;Instanciation de RED&lt;/h3&gt;

&lt;p&gt;La dernière étape consiste à l'instanciation de RED sur BLACK. Cette requête doit être lancée sur la base BLACK.&lt;/p&gt;
&lt;pre&gt;
set serveroutput on size 1000000
declare
  current_scn number;
begin
  current_scn:=dbms_flashback.get_system_change_number();
  dbms_output.put_line( 'SCN Courant : ' || current_scn );
  dbms_apply_adm.set_schema_instantiation_scn@RED(
    source_schema_name =&amp;gt; 'ALICE',
    source_database_name =&amp;gt; 'BLACK',
    instantiation_scn =&amp;gt; current_scn,
    recursive =&amp;gt; true
  );
end;
/
&lt;/pre&gt;

&lt;h3&gt;Importation des données Alice de RED vers BLACK&lt;/h3&gt;

&lt;p&gt;Utilisation via datapump. Sur chaque serveur créer un répertoire /home/oracle/dpump. Sur chaque base créer un object directory dpump&lt;/p&gt;
&lt;pre&gt;
create directory dpump as '/home/oracle/dpump';
&lt;/pre&gt;

&lt;p&gt;L'import datapump dans BLACK se fera via un dblink -&amp;gt; RED. Dans un premier temps relever le numéro SCN de la base RED&lt;/p&gt;
&lt;pre&gt;
select dbms_flashback.get_system_change_number() from dual;

74246358
&lt;/pre&gt;

&lt;p&gt;Ce numéro doit être utilisé par l'import datapump.Sur la base BLACK lancer l'import datapump ainsi&lt;/p&gt;
&lt;pre&gt;
impdp strmadmin/strmadmin@black directory=dpump network_link=red logfile=alice.dpimp.log table_exists_action=replace schemas=alice flashback_scn=74246358
&lt;/pre&gt;

&lt;h3&gt;Démarrage du STREAMS&lt;/h3&gt;

&lt;p&gt;Sur la base BLACK, démarrer l'apply et la capture&lt;/p&gt;
&lt;pre&gt;
exec dbms_apply_adm.start_apply(apply_name=&amp;gt;'APPLY_ALICE');
exec dbms_capture_adm.start_capture(capture_name=&amp;gt;'CAPTURE_ALICE');
&lt;/pre&gt;

&lt;p&gt;Sur la base RED démarrer l'apply et la capture.&lt;/p&gt;
&lt;pre&gt;
exec dbms_apply_adm.start_apply(apply_name=&amp;gt;'APPLY_ALICE');
exec dbms_capture_adm.start_capture(capture_name=&amp;gt;'CAPTURE_ALICE');
&lt;/pre&gt;

&lt;h3&gt;Test&lt;/h3&gt;

&lt;p&gt;Se connecter à RED en alice et insérer la ligne suivante :&lt;/p&gt;
&lt;pre&gt;
insert into compositeur values(8,'Maurice','Jarre',null,null);
commit;
&lt;/pre&gt;

&lt;p&gt;Visualiser sur BLACK en connection alice la presence de l'insertion&lt;/p&gt;


&lt;p&gt;Se connecter à BLACK en alice et faire un update&lt;/p&gt;
&lt;pre&gt;
update compositeur set naissance=to_date('13/09/1924','DD/MM/YYYY') where nocomp=8;
commit;
&lt;/pre&gt;

&lt;p&gt;Se reconnecter à RED pour voir la modification, puis faire un autre update&lt;/p&gt;
&lt;pre&gt;
update compositeur set deces=to_date('28/03/2009','DD/MM/YYYY') where nocomp=8;
commit;
&lt;/pre&gt;

&lt;p&gt;Les deux bases doivent être synchronisées.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;La mise en place n'est pas très complexe, il faut juste être attentif à la symétrie. L'avantage c'est que les mises à jours peuvent se faire sur l'une ou l'autre des bases.&lt;/p&gt;</description>

    

      </item>
  
  <item>
    <title>Sql*Loader et les dates</title>
    <link>http://www.silverlake.fr/index.php?post/2018/11/25/Sql%2ALoader-et-les-dates</link>
    <guid isPermaLink="false">urn:md5:3b6061d09d0965fbd30f418cb347fff6</guid>
    <pubDate>Sun, 25 Nov 2018 18:14:00 +0100</pubDate>
    <dc:creator>Silverlake</dc:creator>
        <category>Oracle</category>
        
    <description>    &lt;h3&gt;Introduction&lt;/h3&gt;

&lt;p&gt;SQL*Loader est un utilitaire fourni avec Oracle permettant de charger des données dans des tables Oracle depuis des fichiers plats. Le schéma ci-dessous présente le principe de SQL*Loader.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.silverlake.fr/public/.sqlloader_m.png&quot; alt=&quot;sqlloader.png&quot; title=&quot;sqlloader.png, nov. 2018&quot; /&gt;&lt;/p&gt;


&lt;p&gt;En entrée, SQL*Loader prend un fichier de contrôle ( rien à voir avec le fichier de contrôle de la base de données ) qui pilote le chargement, et un ou plusieurs fichiers de données ASCII.&lt;/p&gt;


&lt;p&gt;En sortie, SQL*Loader alimente la base de données Oracle et génère un fichier journal (log), un fichier des rejets (bad - données erronées) et un fichier des refus (discard - données écartées).&lt;/p&gt;


&lt;p&gt;Le fichier bad contient des enregistrements qui ont été rejetés par SQL*Loader (format de l’enregistrement non valide par rapport à la description du fichier de contrôle)&lt;/p&gt;


&lt;p&gt;Le fichier discard contient les enregistrements rejetés par Oracle (violation d’une contrainte d’intégrité, type de données non valide, etc.).&lt;/p&gt;


&lt;p&gt;Les enregistrements rejetés ou refusés sont écrits tels quels dans les fichiers bad et discard qui ont donc, la même structure que les fichiers de données utilisés en entrée ; après correction éventuelle des enregistrements, les fichiers bad et discard peuvent être utilisés comme fichiers d’entrée.&lt;/p&gt;


&lt;p&gt;Ce billet présente une insertion via SQL*Loader avec des dates. Ce type de données peut parfois poser des soucis si le fichier de contrôle n'est pas correctement paramétré.&lt;/p&gt;

&lt;h3&gt;Fichier des données&lt;/h3&gt;

&lt;p&gt;Ci dessous le fichier à intégrer-&amp;gt; personnes.txt&lt;/p&gt;
&lt;pre&gt;
code|prenom|nom|adr|datenais
10|Walker|Tyler|CP 192, 3418 Magna Ave|30/11/1948 02:49:10,101010
15|Lacota|Yates|391 Nisi. Ave|05/07/1969 21:35:55,555555
20|Patricia|Briggs|Appartement 758-7764 Cras Rd.|12/07/1957 08:28:46,464646
25|Aileen|Wiggins|4078 Libero Av.|06/07/1947 16:36:46,464646
30|Rhiannon|Bender|308 Commodo Chemin|25/07/1965 15:52:58,585858
35|Keith|Simpson|Appartement 839-742 Hendrerit. Ave|04/11/1963 04:52:13,131313
40|Jesse|Baker|343-1474 Vestibulum. Rue|25/07/1965 19:53:08,080808
45|Hilel|Fuentes|6993 Taciti Chemin|19/03/1967 17:09:41,414141
50|Bradley|Carroll|9347 Malesuada Chemin|23/11/1965 14:48:21,212121
55|Bianca|Rodriguez|Appartement 964-8829 Hymenaeos. Rue|22/11/1953 12:29:16,161616
&lt;/pre&gt;

&lt;p&gt;La particularité est ici que le champ datenais est au format Oracle &lt;strong&gt;timestamp&lt;/strong&gt;. La table personnes est donc créée ainsi :&lt;/p&gt;
&lt;pre&gt;
create table personnes ( code number(2), prenom varchar2( 15 char ), nom varchar2( 15 char), adr varchar2( 40 char ), datenais timestamp );
&lt;/pre&gt;

&lt;h3&gt;Fichier de contrôle&lt;/h3&gt;

&lt;p&gt;Ci dessous le fichier de contrôle SQL*Loader&lt;/p&gt;
&lt;pre&gt;
options (skip=1)
load data 
truncate
into table personnes
fields terminated by '|'
( code,
prenom,
nom,
adr,
datenais timestamp 'DD/MM/YYYY HH24:MI:SS,FF6' )
&lt;/pre&gt;

&lt;p&gt;La clause options permet de ne pas tenir compte des entêtes de colonnes.&lt;/p&gt;


&lt;p&gt;La ligne datenais permet de définir comment la date est structurée dans le fichier d'origine.&lt;/p&gt;

&lt;h3&gt;Chargement&lt;/h3&gt;

&lt;p&gt;Une fois correctement établi le fichier de contrôle le chargement est simple&lt;/p&gt;
&lt;pre&gt;
sqlldr userid=alice/ecila data=personnes.txt control=personnes.ctl log=personnes.log bad=personnes.bad discard=personnes.discard
&lt;/pre&gt;

&lt;p&gt;Il est bien entendu possible de passer via un fichier de paramètres et la clause parfile.&lt;/p&gt;


&lt;p&gt;Fichier de paramètres -&amp;gt; personnes.load&lt;/p&gt;
&lt;pre&gt;
userid=alice/ecila
control=personnes.ctl
log=personnes.log
bad=personnes.bad
discard=personnes.discard
&lt;/pre&gt;

&lt;p&gt;Lancement&lt;/p&gt;
&lt;pre&gt;
sqlldr parfile=personnes.load
&lt;/pre&gt;

&lt;h3&gt;Note relatif à la langue&lt;/h3&gt;

&lt;p&gt;Dans certains cas il peut être intéressant de modifier la langue dans laquelle est générée la trace. Ceci se fait en modifiant correctement la variable NLS_LANG.&lt;/p&gt;


&lt;p&gt;Trace en anglais :&lt;/p&gt;
&lt;pre&gt;
export NLS_LANG=AMERICAN_AMERICA.UTF8
 sqlldr alice/ecila data=personnes.txt control=personnes.ctl log=personnes.english.log bad=personnes.bad discard=personnes.discard

SQL*Loader: Release 12.1.0.2.0 - Production on Sun Nov 25 18:20:17 2018

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Path used:      Conventional
Commit point reached - logical record count 10

Table PERSONNES:
  10 Rows successfully loaded.

Check the log file:
  personnes.english.log
for more information about the load.
&lt;/pre&gt;

&lt;p&gt;Traces en français.&lt;/p&gt;
&lt;pre&gt;
export NLS_LANG=FRENCH_FRANCE.UTF8
sqlldr alice/ecila data=personnes.txt control=personnes.ctl log=personnes.francais.log bad=personnes.bad discard=personnes.discard

SQL*Loader: Release 12.1.0.2.0 - Production on Dim. Nov. 25 18:20:39 2018

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Chemin utilisé:      Classique
Point de validation (COMMIT) atteint - nombre d'enregis. logiques 10

Table PERSONNES :
  10 Lignes - Chargement terminé.

Pour plus d'informations sur le chargement, consultez le fichier journal :
  personnes.francais.log
&lt;/pre&gt;

&lt;p&gt;La définition correcte dans le fichier de contrôle du champ datenais est alors primordial, car les américains ne représentent pas les dates comme la France.&lt;/p&gt;</description>

    

      </item>
  
  <item>
    <title>Déplacer la base MGMTDB vers un autre diskgroup sur un cluster Oracle 12c.</title>
    <link>http://www.silverlake.fr/index.php?post/2018/11/08/D%C3%A9placer-la-base-MGMTDB-sur-au-autre-diskgroup.</link>
    <guid isPermaLink="false">urn:md5:0a0702c494c96a00ab2db169b596cd37</guid>
    <pubDate>Thu, 08 Nov 2018 17:13:00 +0100</pubDate>
    <dc:creator>Silverlake</dc:creator>
        <category>Oracle</category>
        
    <description>    &lt;h3&gt;Introduction&lt;/h3&gt;

&lt;p&gt;Cette procédure explique comment déplacer la base _MGMTDB vers un autre diskgroup. Cette base gère les informations sur la &quot;santé&quot; du cluster RAC. Lors de la création du cluster cette base est créée sur le diskgroup de l'OCR soit +OCR_VOTING. Il s'agit ici de la déplacer sur +DG_MGMTDB. La version de Oracle utilisée est la 12.1.0.2. Dans cette version la base MGMTDB est de type Plugable Database.&lt;/p&gt;

&lt;h3&gt;Désactivation ressource&lt;/h3&gt;

&lt;p&gt;Sur chaque noeud &lt;strong&gt;en tant que root&lt;/strong&gt; stopper et désactiver la ressource ora.crf&lt;/p&gt;
&lt;pre&gt;
/ora01/app/oragrid/product/12.1.0.2/GI/bin/crsctl stop res ora.crf -init
/ora01/app/oragrid/product/12.1.0.2/GI/bin/crsctl modify res ora.crf -attr ENABLED=0 -init
&lt;/pre&gt;

&lt;p&gt;Vérification&lt;/p&gt;
&lt;pre&gt;
/ora01/app/oragrid/product/12.1.0.2/GI/bin/crsctl stat res -t -init
&lt;/pre&gt;

&lt;p&gt;Sortie :&lt;/p&gt;
&lt;pre&gt;
...
ora.crf   1    OFFLINE OFFLINE                    STABLE
...
&lt;/pre&gt;

&lt;p&gt;La ressource est bien OFFLINE&lt;/p&gt;

&lt;h3&gt;Déplacement de la base&lt;/h3&gt;

&lt;p&gt;Le principe est de détruire la base et de la recréer sur le nouveau diskgroup. Les actions sont faites &lt;strong&gt;en tant que user oragrid&lt;/strong&gt;. Dans un premier temps relever sur quel noeud tourne la base MGMTDB.&lt;/p&gt;
&lt;pre&gt;
srvctl status MGMTDB
Database is enabled
Instance -MGMTDB is running on node SRV1
&lt;/pre&gt;

&lt;p&gt;Par DBCA supprimer la base MGMTDB depuis le noeud retrouvé précédement soit SRV1.&lt;/p&gt;
&lt;pre&gt;
dbca -silent -deleteDatabase -sourceDB -MGMTDB
&lt;/pre&gt;

&lt;p&gt;Puis la recréer sur le nouveau diskgroup ici +DG_MGMTDB&lt;/p&gt;
&lt;pre&gt;
dbca -silent -createDatabase -sid -MGMTDB -createAsContainerDatabase true -templateName MGMTSeed_Database.dbc -gdbName _mgmtdb -storageType ASM -diskGroupName +DG_MGMTDB -datafileJarLocation /ora01/app/oragrid/product/12.1.0.2/GI/assistants/dbca/templates -characterset AL32UTF8 -autoGeneratePasswords -skipUserTemplateCheck
&lt;/pre&gt;

&lt;p&gt;En 12c la base MGMTDB est de type CDB, retrouver le nom du cluster avant de créer la PDB.&lt;/p&gt;
&lt;pre&gt;
olsnodes -c
delta
&lt;/pre&gt;

&lt;p&gt;Si le nom comporte des tirets il faut les remplacer dans la commande, clause pdbName, par des underscores ( exemple CRS-001 -&amp;gt; CRS_001 ). Dans l'exemple le cluster se nomme delta donc pdbName = DELTA.&lt;/p&gt;
&lt;pre&gt;
dbca -silent -createPluggableDatabase -sourceDB -MGMTDB -pdbName DELTA -createPDBFrom RMANBACKUP -PDBBackUpfile /ora01/app/oragrid/product/12.1.0.2/GI/assistants/dbca/templates/mgmtseed_pdb.dfb -PDBMetadataFile /ora01/app/oragrid/product/12.1.0.2/GI/assistants/dbca/templates/mgmtseed_pdb.xml -createAsClone true
&lt;/pre&gt;

&lt;p&gt;Une fois créée, demander la sécurisation par la commande mgmtca. Il ne doit pas y avoir d'erreur.&lt;/p&gt;


&lt;p&gt;L'erreur la plus courante est de ne pas indiquer correctement le nom du cluster ce qui provoque l'erreur suivante :&lt;/p&gt;
&lt;pre&gt;
MGTCA-1101 : failure in Oracle Grid Infrastructure Management Repository operation
&lt;/pre&gt;

&lt;p&gt;Dans ce cas refaire les étapes de création. ( Voir MOS : Doc ID 2168379.1 )&lt;/p&gt;


&lt;p&gt;Vérification&lt;/p&gt;
&lt;pre&gt;
srvctl status MGMTDB
Database is enabled
Instance -MGMTDB is running on node SRV1
&lt;/pre&gt;

&lt;h3&gt;Réactivation ressource&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Se connecter root sur chaque noeud&lt;/strong&gt; et réactiver la ressource ora.crf.&lt;/p&gt;
&lt;pre&gt;
/ora01/app/oragrid/product/12.1.0.2/GI/bin/crsctl modify res ora.crf -attr ENABLED=1 -init
/ora01/app/oragrid/product/12.1.0.2/GI/bin/crsctl start res ora.crf -init
&lt;/pre&gt;

&lt;p&gt;Vérification&lt;/p&gt;
&lt;pre&gt;
/ora01/app/oragrid/product/12.1.0.2/GI/bin/crsctl stat res -t -init
&lt;/pre&gt;

&lt;p&gt;Sortie :&lt;/p&gt;
&lt;pre&gt;
...
ora.crf    1        ONLINE  ONLINE     SRV1      STABLE
&lt;/pre&gt;

&lt;p&gt;La ressource est bien ONLINE.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;Sur l'ancien diskgroup, soit +OCR_VOTING, il peut rester une arborescence relative à MGMTDB. Celle-ci peut être supprimée manuellement sans danger car il ne s'agit que de répertoires et non de fichiers.&lt;/p&gt;</description>

    

      </item>
  
  <item>
    <title>Traces Oracle et ADRCI</title>
    <link>http://www.silverlake.fr/index.php?post/2018/06/14/Trace-Oracle-et-ADRCI</link>
    <guid isPermaLink="false">urn:md5:77d62894aa2465502da7c221621a1a1f</guid>
    <pubDate>Thu, 14 Jun 2018 08:55:00 +0200</pubDate>
    <dc:creator>Silverlake</dc:creator>
        <category>Oracle</category>
        
    <description>    &lt;h3&gt;Introduction&lt;/h3&gt;

&lt;p&gt;Trois shell Linux très simples pour configurer de manière rapide et efficace la gestion des traces Oracle via ADRCI. Automatic Diagnostic Repository introduit en 11g permet une centralisation des traces Oracle en un point unique ( BD, Listener,... ). la politique de conservation de ces traces est gérée par 2 paramètres :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SHORTP : Traces ordinaires&lt;/li&gt;
&lt;li&gt;LONGP : Traces incidents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En fonction de la durée de conservation, exprimée en heure, les traces sont automatiquement purgées. les shell suivants permettent de configurer rapidement la politique souhaitée.&lt;/p&gt;

&lt;h4&gt;Visualisation&lt;/h4&gt;

&lt;p&gt;adrci_show_control.sh&lt;/p&gt;
&lt;pre&gt;
#!/bin/bash
# Visualise la short et la long policy pour la purge des traces oracle
for i in $( adrci exec=&amp;quot;show homes&amp;quot; | grep -v &amp;quot;ADR Homes:&amp;quot; )
do
echo &amp;quot;SHOW CONTROL ${i}:&amp;quot;
adrci exec=&amp;quot;set home ${i}; show control;&amp;quot;
done
&lt;/pre&gt;

&lt;h4&gt;Affectation&lt;/h4&gt;

&lt;p&gt;adrci_set_control.sh&lt;/p&gt;
&lt;pre&gt;
#!/bin/bash
# Affecte la short et la long policy pour la conservation des traces oracle
# La duree est exprimee en heures.
export SHORT=168 # 1 semaine ( 7 jours )
export LONG=720 # 1 mois ( 30 jours )
for i in $( adrci exec=&amp;quot;show homes&amp;quot; | grep -v &amp;quot;ADR Homes:&amp;quot; )
do
echo &amp;quot;set control ${i}:&amp;quot;
adrci exec=&amp;quot;set home ${i}; set control \(SHORTP_POLICY=${SHORT}, LONGP_POLICY=${LONG}\);&amp;quot;
done
&lt;/pre&gt;

&lt;h4&gt;Lancement manuel&lt;/h4&gt;

&lt;p&gt;adrci_purge.sh&lt;/p&gt;
&lt;pre&gt;
#!/bin/bash
# Lancement manuel de la purge des traces oracle
# La duree est exprimee en minutes
export TEMPS=240 # ( 4 heures )
for i in $( adrci exec=&amp;quot;show homes&amp;quot; | grep -v &amp;quot;ADR Homes:&amp;quot; )
do
echo &amp;quot;purge ${i}:&amp;quot;
adrci exec=&amp;quot;set home ${i}; show control; purge -age ${TEMPS}&amp;quot;
done
&lt;/pre&gt;</description>

    

      </item>
  
  <item>
    <title>Cluster RAC et Dataguard avec Oracle 12c</title>
    <link>http://www.silverlake.fr/index.php?post/2018/06/09/Cluster-RAC-et-Dataguard-avec-Oracle-12c</link>
    <guid isPermaLink="false">urn:md5:a28384201231a0914ddc4397385ee11f</guid>
    <pubDate>Sat, 09 Jun 2018 10:29:00 +0200</pubDate>
    <dc:creator>Silverlake</dc:creator>
        <category>Oracle</category>
        
    <description>    &lt;h3&gt;Introduction&lt;/h3&gt;

&lt;p&gt;Ce billet, assez conséquent, détaille la mise en place d'un environnement Dataguard Oracle 12c en utilisant deux clusters RAC à deux noeuds sur des sites distants.  La version de l'OS est CentOS 7.4. La version de Oracle est la 12.1.0.2 avec application du PSU de avril 2018.&lt;/p&gt;


&lt;p&gt;Il est supposé une bonne connaissance du RAC et du Dataguard en général.&lt;/p&gt;


&lt;p&gt;Au moment de la configuration seule la base YODASA est en place.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DB_NAME : YODA&lt;/li&gt;
&lt;li&gt;DB_UNIQUE_NAME : YODASA ( primaire )&lt;/li&gt;
&lt;li&gt;DB_UNIQUE_NAME : YODASB ( standby )&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Les fichiers de la base sont sur des diskgroups ASM :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DG_YODA&lt;/li&gt;
&lt;li&gt;FRA_YODA&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;La gestion OMF est en place.&lt;/p&gt;


&lt;p&gt;La Fast Recovery Area est configurée sur le diskgroup FRA_YODA.&lt;/p&gt;


&lt;p&gt;Le schéma ci-dessous présente succinctement la configuration.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.silverlake.fr/public/cluster_test_dataguard.jpg&quot; alt=&quot;cluster test dataguard.jpg&quot; title=&quot;cluster test dataguard.jpg, juin 2018&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Il n'est pas détaillé ici l'installation des binaires Oracle ( Grid et RDBMS ) ainsi que la création de la base primaire YODASA.&lt;/p&gt;


&lt;p&gt;Les variables d'environnement Oracle sont :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ORACLE_BASE=/ora01/app/oracle&lt;/li&gt;
&lt;li&gt;ORACLE_HOME=/ora01/app/oracle/product/12.1.0.2/DB ( RDBMS, user oracle )&lt;/li&gt;
&lt;li&gt;ORACLE_HOME=/ora01/app/oragrid/product/12.1.0.2/GI ( GRID, user oragrid )&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;La couche Oracle*Net&lt;/h3&gt;

&lt;p&gt;Les serveurs sont tous gérés par un DNS sur une zone fictive nommée formation.maison. La configuration DNS n'est pas détaillée ici.&lt;/p&gt;


&lt;p&gt;Un soin particulier doit être de mise pour cette configuration. Le dataguard utilise massivement le réseau. Les lignes suivantes doivent être présentes &lt;strong&gt;sur tous les noeuds&lt;/strong&gt; de la configuration dans le fichier tnsnames.ora.&lt;/p&gt;
&lt;pre&gt;
YODASA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = rac01-scan.formation.maison)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = YODASA)
    )
  )

YODASB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = rac02-scan.formation.maison)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = UMUTST1VE)
    )
  )

# Seulement pour RMAN duplicate ... from active database
YODASA_DUP =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = ora01sa.formation.maison)(PORT = 1521))
     )
    (CONNECT_DATA =
      (SERVICE_NAME = YODASA)
    )
  )

YODASB_DUP =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST =ora01sb.formation.maison )(PORT = 1521))
       )
    (CONNECT_DATA =
      (SERVICE_NAME = YODASB)
    )
  )
&lt;/pre&gt;

&lt;p&gt;Pour les entrées type *_DUP il faut utiliser l'adresse VIP et un seul des noeuds. Via la commande tnsping, vérifier sur chaque noeud la réponse correcte de la configuration TNS. La boucle shell suivante exécute cette vérification.&lt;/p&gt;
&lt;pre&gt;
for i in YODASA YODASB YODASA_DUP YODASB_DUP; do echo -n $i;  echo -n &amp;quot; --&amp;gt; &amp;quot;; tnsping $i | grep OK; done
YODASA --&amp;gt; OK (10 msec)
YODASB --&amp;gt; OK (20 msec)
YODASA_DUP --&amp;gt; OK (0 msec)
YODASB_DUP --&amp;gt; OK (20 msec)
&lt;/pre&gt;

&lt;p&gt;Sur les noeuds du SITEB soit ora01sb et ora02sb ajouter les lignes suivantes dans le fichier listener.ora. Attention selon le noeud les lignes sont différentes.
&lt;strong&gt;Sur le serveur ora01sb&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = YODASB)
      (ORACLE_HOME = /ora01/app/oracle/product/12.1.0.2/DB)
      (SID_NAME = YODASB1)
    )
  )
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Sur le serveur ora02sb&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = YODASB)
      (ORACLE_HOME = /ora01/app/oracle/product/12.1.0.2/DB)
      (SID_NAME = YODASB2)
    )
  )
&lt;/pre&gt;

&lt;p&gt;Entre les deux noeuds le nom de l'instance est différent. Il faut recharger la configuration listener sur chaque noeuds de SITEB par la commande ''lsnrctl reload&quot;&quot;.&lt;/p&gt;

&lt;h3&gt;Préparation base primaire&lt;/h3&gt;

&lt;p&gt;Certaines actions sont nécessaires avant de lancer la création de la standby. La base primaire doit être en archivelog.&lt;/p&gt;
&lt;pre&gt;
YODASA1.SYS &amp;gt; select log_mode from v$database;

LOG_MODE
------------
ARCHIVELOG

YODASA1.SYS &amp;gt; archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     34
Next log sequence to archive   36
Current log sequence           36
YODASA1.SYS &amp;gt;
&lt;/pre&gt;

&lt;p&gt;Il est de plus nécessaire d'activer le mode force logging.&lt;/p&gt;
&lt;pre&gt;
alter database force logging;
&lt;/pre&gt;

&lt;p&gt;La requête suivante permet de vérifier certains points. Pour cette procédure le mode flashback n'est pas actif.&lt;/p&gt;
&lt;pre&gt;
YODASA1.SYS &amp;gt; select name,db_unique_name,database_role,log_mode,force_logging,flashback_on from v$database;

NAME      DB_UNIQUE_NAME                 DATABASE_ROLE    LOG_MODE     FORCE_LOGGING                           FLASHBACK_ON
---------       ------------------------------ ---------------- ------------ --------------------------------------- ------------------
YODA      YODASA                      PRIMARY          ARCHIVELOG   YES                                     NO

YODASA1.SYS &amp;gt;
&lt;/pre&gt;

&lt;h4&gt;Configuration du transport et l'apply&lt;/h4&gt;

&lt;p&gt;Plusieurs paramètre sont nécessaires pour le transport et l'application des ordres SQL.&lt;/p&gt;
&lt;pre&gt;
alter system set log_archive_config='DG_CONFIG=(YODASA,YODASB)' scope=both sid='*';
alter system set log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=YODASA' scope=both sid='*';
alter system set log_archive_dest_2='SERVICE=YODASB VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=YODASB' scope=both sid='*';
alter system set log_archive_max_processes=8 scope=both sid='*';
alter system set fal_client='YODASA' scope=both sid='*';
alter system set fal_server='YODASB' scope=both sid='*';
alter system set standby_file_management=AUTO scope=both sid='*';
&lt;/pre&gt;

&lt;h4&gt;Standby redolog&lt;/h4&gt;

&lt;p&gt;Les standby redolog sont utilisés par la base standby, toutefois une base peut être primaire ou standby donc il est de bonne pratique de crééer de suite les standby redolog. Il faut 1 standby redolog de plus par thread et ils doivent avoir la même dimension que les online redolog.&lt;/p&gt;
&lt;pre&gt;
YODASA1.SYS &amp;gt; select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME     CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ --------- ----------
         1          1         34   52428800        512          2 YES INACTIVE                377639 06-JUN-18       420081 06-JUN-18          0
         2          1         35   52428800        512          2 YES INACTIVE                420081 06-JUN-18       463619 07-JUN-18          0
         3          1         36   52428800        512          2 NO  CURRENT                 463619 07-JUN-18   2.8147E+14                    0
         4          2          7   52428800        512          2 YES INACTIVE                427685 06-JUN-18       437418 06-JUN-18          0
         5          2          8   52428800        512          2 YES INACTIVE                437418 06-JUN-18       462576 07-JUN-18          0
         6          2          9   52428800        512          2 NO  CURRENT                 462576 07-JUN-18   2.8147E+14                    0

6 rows selected.

YODASA1.SYS &amp;gt;
&lt;/pre&gt;

&lt;p&gt;La base primaire comporte 3 groupes de online redolog par thread ( taille des membres : 50Mo ), il faut donc 4 standby redolog par thread. &lt;strong&gt;Oracle recommande de ne pas multiplexer les standby redolog.&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
YODASA1.SYS &amp;gt; alter database add standby logfile thread 1 ('+DG_YODA') size 50M;

Database altered.

YODASA1.SYS &amp;gt; /

Database altered.

YODASA1.SYS &amp;gt; /

Database altered.

YODASA1.SYS &amp;gt; /

Database altered.

YODASA1.SYS &amp;gt; alter database add standby logfile thread 2 ('+DG_YODA') size 50M;

Database altered.

YODASA1.SYS &amp;gt; /

Database altered.

YODASA1.SYS &amp;gt; /

Database altered.

YODASA1.SYS &amp;gt; /

Database altered.
YODASA1.SYS &amp;gt; select group#,thread#,sequence#,bytes,status from v$standby_log;

    GROUP#    THREAD#  SEQUENCE#      BYTES STATUS
---------- ---------- ---------- ---------- ----------
         7          1          0   52428800 UNASSIGNED
         8          1          0   52428800 UNASSIGNED
         9          1          0   52428800 UNASSIGNED
        10          1          0   52428800 UNASSIGNED
        11          2          0   52428800 UNASSIGNED
        12          2          0   52428800 UNASSIGNED
        13          2          0   52428800 UNASSIGNED
        14          2          0   52428800 UNASSIGNED

8 rows selected.

YODASA1.SYS &amp;gt;
&lt;/pre&gt;

&lt;h3&gt;Fichier de paramètres&lt;/h3&gt;

&lt;p&gt;Pour la génération de la standby partir du pfile de la primaire et y apporter certaines modifications.&lt;/p&gt;
&lt;pre&gt;
create pfile='/home/oracle/initYODASB1.ora' from spfile;
&lt;/pre&gt;

&lt;p&gt;Editier ce fichier, retirer toutes les lignes contenant &quot;__&quot; ainsi que les lignes cluster_database et control_files.&lt;/p&gt;


&lt;p&gt;Dans un dataguard le paramètre DB_NAME doit être identique sur les deux sites soit ici YODA. C'est le paramètre DB_UNIQUE_NAME qui fait la différence.&lt;/p&gt;


&lt;p&gt;Modifier les occurences YODASA et YODASB ( YODASA devient YODASB et réciproquement ) voir exemple suivant :&lt;/p&gt;
&lt;pre&gt;
*.db_block_size=8192
*.db_create_file_dest='+DG_YODA'
*.db_name='YODA'
*.db_recovery_file_dest='FRA_YODA'
*.db_recovery_file_dest_size=20G
*.db_unique_name='YODASB'
*.fal_client='YODASB'
*.fal_server='YODASA'
YODASB1.instance_number=1
YODASB2.instance_number=2
*.log_archive_config='DG_CONFIG=(YODASA,YODASB)'
*.log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=YODASB'
*.log_archive_dest_2='SERVICE=YODASA VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=YODASA'
*.log_archive_format='YODA_%t_%s_%r.arch'
*.log_archive_max_processes=8
*.open_cursors=300
*.pga_aggregate_target=360M
*.processes=300
*.remote_login_passwordfile='exclusive'
*.sga_target=1280M
*.standby_file_management='AUTO'
YODASB1.thread=1
YODASB2.thread=2
YODASB1.undo_tablespace='UNDOTBS1'
YODASB2.undo_tablespace='UNDOTBS2'
&lt;/pre&gt;

&lt;p&gt;Ce fichier est à copier sous le nom initYODASB1.ora sur le serveur ora01sb dans le répertoire $ORACLE_HOME/dbs. Le principe est dans un premier temps de créer la standby sans gestion de cluster et de l'activer par la suite.&lt;/p&gt;

&lt;h3&gt;Fichier de mot de passe&lt;/h3&gt;

&lt;p&gt;Toujours sur le serveur ora01sb et dans $ORACLE_HOME/dbs crééer un fichier de mot de passe temporaire. Celui-ci sera recopié par RMAN lors du duplicate depuis la base primaire.&lt;/p&gt;
&lt;pre&gt;
orapwd file=orapwYODASB1
Enter password for SYS:
&lt;/pre&gt;

&lt;h3&gt;Création de la standby&lt;/h3&gt;

&lt;p&gt;La création utilisera RMAN via la commande duplicate from active database. Ici  la création est lancée depuis le serveur ora01sb&lt;/p&gt;
&lt;pre&gt;
rman target sys@YODASA_DUP auxiliary sys@YODASB_DUP

Recovery Manager: Release 12.1.0.2.0 - Production on Thu Jun 7 07:52:05 2018

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

target database Password:
connected to target database: YODASA1 (DBID=2193309380)
auxiliary database Password:
connected to auxiliary database (not started)

RMAN&amp;gt; startup clone nomount;

Oracle instance started

Total System Global Area    1342177280 bytes

Fixed Size                     2924160 bytes
Variable Size                402653568 bytes
Database Buffers             922746880 bytes
Redo Buffers                  13852672 bytes

RMAN&amp;gt; duplicate target database for standby from active database;

Starting Duplicate Db at 07/06/2018 09:00:33
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=2 device type=DISK
...
...
Finished Duplicate Db at 07/06/2018 09:02:22

RMAN&amp;gt;
&lt;/pre&gt;

&lt;p&gt;A ce stade la standby est en place il reste à l'intégrer au cluster. Editer le fichier $ORACLE_HOME/dbs/initYODASB1.ora et ajouter les deux lignes suivantes :&lt;/p&gt;
&lt;pre&gt;
*.cluster_database=true
*.control_files='+DG_YODA/YODASB/CONTROLFILE/current.281.978166873','+FRA_YODA/YODASB/CONTROLFILE/current.499.978166875'
&lt;/pre&gt;

&lt;p&gt;Le noms des fichiers de contrôle générés est disponible dans la trace du duplicate RMAN.&lt;/p&gt;


&lt;p&gt;Supprimer le spfile généré&lt;/p&gt;
&lt;pre&gt;
rm $ORACLE_HOME/dbs/spfileYODASB1.ora
&lt;/pre&gt;

&lt;p&gt;Stopper la base standby et la redémarrer en mode mount.&lt;/p&gt;
&lt;pre&gt;
export ORACLE_SID=YODASB1
sqlplus / as sysdba

shutdown immediate;
startup mount
&lt;/pre&gt;

&lt;p&gt;Créer le spfile sur le diskgroup ASM&lt;/p&gt;
&lt;pre&gt;
create spfile='+DG_YODA/YODASB/spfileYODASB.ora' from pfile;
shutdown immediate;
&lt;/pre&gt;

&lt;p&gt;Sur chaque noeud du cluster standby créer sous $ORACLE_HOME/dbs un fichier initYODASB1.ora ( ora01sb ) et initYODASB2.ora ( ora02sb ) avec la ligne suivante :&lt;/p&gt;
&lt;pre&gt;
SPFILE='+DG_YODA/YODASB/spfileYODASB.ora'
&lt;/pre&gt;

&lt;h3&gt;Intégration au cluster&lt;/h3&gt;

&lt;p&gt;Les commandes suivantes intègre la base standby au cluster&lt;/p&gt;
&lt;pre&gt;
srvctl add database -db YODASB -oraclehome $ORACLE_HOME -dbtype RAC -role PHYSICAL_STANDBY -startoption MOUNT -dbname YODA -diskgroup &amp;quot;DG_YODA,FRA_YODA&amp;quot;
srvctl add instance -db YODASB -instance YODASB1 -node ora02sa
srvctl add instance -db YODASB -instance YODASB2 -node ora02sb
srvctl modify database -db YODASB -spfile '+DG_YODA/YODASB/spfileYODASB.ora'
srvctl config database -db YODASB
Database unique name: YODASB
Database name: YODA
Oracle home: /ora01/app/oracle/product/12.1.0.2/DB
Oracle user: oracle
Spfile: +DG_YODA/YODASB/spfileYODASB.ora
Password file:
Domain:
Start options: mount
Stop options: immediate
Database role: PHYSICAL_STANDBY
Management policy: AUTOMATIC
Server pools:
Disk Groups: DG_YODA,FRA_YODA
Mount point paths:
Services:
Type: RAC
Start concurrency:
Stop concurrency:
OSDBA group: g_db_sysdba
OSOPER group: g_db_sysoper
Database instances: YODASB1,YODASB2
Configured nodes: ora01sb,ora02sb
Database is administrator managed
&lt;/pre&gt;

&lt;h3&gt;Activation dataguard&lt;/h3&gt;

&lt;p&gt;Démarrer la base standby&lt;/p&gt;
&lt;pre&gt;
srvctl start database -db YODASB
srvctl status database -db YODASB
Instance YODASB1 is running on node ora01sb
Instance YODASB2 is running on node ora02sb
&lt;/pre&gt;

&lt;p&gt;Se connecter à la standby et activer le recouvrement&lt;/p&gt;
&lt;pre&gt;
alter database recover managed standby database using current logfile disconnect from session;
&lt;/pre&gt;

&lt;p&gt;Les commandes suivantes permettent de voir le fonctionnement correct du dataguard.&lt;/p&gt;


&lt;p&gt;Sur la base primaire YODASA&lt;/p&gt;
&lt;pre&gt;
select thread#,max(sequence#) from v$archived_log group by thread#;

   THREAD# MAX(SEQUENCE#)
         1             41
         2             14
&lt;/pre&gt;

&lt;p&gt;Sur la base standby YODASB&lt;/p&gt;
&lt;pre&gt;
select thread#,max(sequence#) from v$archived_log where applied='YES' group by thread#;

   THREAD# MAX(SEQUENCE#)
         1             41
         2             14
&lt;/pre&gt;

&lt;p&gt;La consultation de la vue V$DATAGUARD_STATUS est aussi intéressante.&lt;/p&gt;

&lt;h3&gt;Fichier de mot de passe&lt;/h3&gt;

&lt;p&gt;Il faut transférer le fichier de mot de passe sur le diskgroup ASM. Sur le serveur ora01sb se connecter oragrid et charger l'environnement asm.&lt;/p&gt;
&lt;pre&gt;
asmcmd -p
ASMCMD [+] &amp;gt; pwcopy --dbuniquename YODASB '/ora01/app/oracle/product/12.1.0.2/DB/dbs/orapwYODASB1' '+DG_YODA/YODASB/orapwYODASB'
copying /ora01/app/oracle/product/12.1.0.2/DB/dbs/orapwUMUTST1VE1 -&amp;gt; +DG_UMU/UMUTST1VE/orapwUMUTST1VE
ASMCMD-9453: failed to register password file as a CRS resource
ASMCMD [+] &amp;gt; exit
&lt;/pre&gt;

&lt;p&gt;Le message ASMCMD-9453 est normal car l'enregistrement doit être fait par le user oracle. Se reconnecter oracle et modifier la configuration cluster&lt;/p&gt;
&lt;pre&gt;
srvctl modify database -db YODASB -pwfile '+DG_YODA/YODASB/orapwYODASB'
&lt;/pre&gt;

&lt;p&gt;Supprimer le fichier de mot de passe local.&lt;/p&gt;
&lt;pre&gt;
rm /ora01/app/oracle/product/12.1.0.2/DB/dbs/orapwYODASB1
&lt;/pre&gt;

&lt;h3&gt;Configuration broker&lt;/h3&gt;

&lt;p&gt;La broker permet de simplifier les commandes d'administration du dataguard. Depuis la version 12c il n'est plus nécessaire de configurer les services _DGMGRL dans le listener.&lt;/p&gt;


&lt;p&gt;Positionner les fichiers de configuration du broker sur l'ASM et démarrer le broker&lt;/p&gt;


&lt;p&gt;Sur base primaire : YODASA&lt;/p&gt;
&lt;pre&gt;
alter system set log_archive_dest_2='' scope=both sid='*';
alter system set dg_broker_config_file1='+DG_YODA/YODASA/dr1YODASA.dat' scope=both sid='*';
alter system set dg_broker_config_file2='+FRA_YODA/YODASA/dr2YODASA.dat' scope=both sid='*';
alter system set dg_broker_start=TRUE scope=both sid='*';
&lt;/pre&gt;

&lt;p&gt;Sur la base standby : YODASB&lt;/p&gt;
&lt;pre&gt;
alter system set log_archive_dest_2='' scope=both sid='*';
alter system set dg_broker_config_file1='+DG_YODA/YODASB/dr1YODASB.dat' scope=both sid='*';
alter system set dg_broker_config_file2='+FRA_YODA/YODASB/dr2YODASB.dat' scope=both sid='*';
alter system set dg_broker_start=TRUE scope=both sid='*';
&lt;/pre&gt;

&lt;p&gt;Depuis le serveur ora01sa ( base primaire ) se connecter au broker&lt;/p&gt;
&lt;pre&gt;
dgmgrl /
DGMGRL&amp;gt; create configuration DG_YODA as primary database is YODASA connect identifier is &amp;quot;YODASA&amp;quot;;
Configuration &amp;quot;dg_yoda&amp;quot; created with primary database &amp;quot;yodasa&amp;quot;
DGMGRL&amp;gt; add database YODASB as connect identifier is &amp;quot;YODASB&amp;quot; maintained as physical;
Database &amp;quot;yodasb&amp;quot; added
DGMGRL&amp;gt; enable configuration;
Enabled.
DGMGRL&amp;gt; show configuration verbose;

Configuration - dg_yoda

  Protection Mode: MaxPerformance
  Members:
  yodasa - Primary database
    yodasb - Physical standby database

  Properties:
    FastStartFailoverThreshold      = '30'
    OperationTimeout                = '30'
    TraceLevel                      = 'USER'
    FastStartFailoverLagLimit       = '30'
    CommunicationTimeout            = '180'
    ObserverReconnect               = '0'
    FastStartFailoverAutoReinstate  = 'TRUE'
    FastStartFailoverPmyShutdown    = 'TRUE'
    BystandersFollowRoleChange      = 'ALL'
    ObserverOverride                = 'FALSE'
    ExternalDestination1            = ''
    ExternalDestination2            = ''
    PrimaryLostWriteAction          = 'CONTINUE'

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS

DGMGRL&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Les commandes show/validate database verbose YODASA et show/validate database verbose YODASB donnent un grand nombre d'informations.&lt;/p&gt;

&lt;h3&gt;Switchover par broker&lt;/h3&gt;

&lt;p&gt;Lancer le broker et se connecter à la future primaire.&lt;/p&gt;
&lt;pre&gt;
dgmgrl
DGMGRL for Linux: Version 12.1.0.2.0 - 64bit Production

Copyright (c) 2000, 2013, Oracle. All rights reserved.

Welcome to DGMGRL, type &amp;quot;help&amp;quot; for information.
DGMGRL&amp;gt; connect sys@YODASB
Password:
Connected as SYSDBA.
DGMGRL&amp;gt; switchover to YODASB;
Performing switchover NOW, please wait...
New primary database &amp;quot;yodasb&amp;quot; is opening...
Oracle Clusterware is restarting database &amp;quot;yodasa&amp;quot; ...
Switchover succeeded, new primary is &amp;quot;yodasb&amp;quot;
DGMGRL&amp;gt; show configuration verbose;
Configuration - dg_yoda

  Protection Mode: MaxPerformance
  Members:
  yodasb - Primary database
    yodasa - Physical standby database

  Properties:
    FastStartFailoverThreshold      = '30'
    OperationTimeout                = '30'
    TraceLevel                      = 'USER'
    FastStartFailoverLagLimit       = '30'
    CommunicationTimeout            = '180'
    ObserverReconnect               = '0'
    FastStartFailoverAutoReinstate  = 'TRUE'
    FastStartFailoverPmyShutdown    = 'TRUE'
    BystandersFollowRoleChange      = 'ALL'
    ObserverOverride                = 'FALSE'
    ExternalDestination1            = ''
    ExternalDestination2            = ''
    PrimaryLostWriteAction          = 'CONTINUE'

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS

DGMGRL&amp;gt;
&lt;/pre&gt;

&lt;h3&gt;Modifier paramètres via le broker&lt;/h3&gt;

&lt;p&gt;Certains paramètres de la base peuvent être modifiés via le broker. Ici par exemple configuration de archive_lag_target à 900 secondes.&lt;/p&gt;
&lt;pre&gt;
DGMGRL&amp;gt; edit database YODASB set property ArchiveLagTarget=900;
DGMGRL&amp;gt; edit database YODASA set property ArchiveLagTarget=900;
DGMGRL&amp;gt; show database verbose YODASB;
Database - yodasb

  Role:               PRIMARY
  Intended State:     TRANSPORT-ON
  Instance(s):
    YODASB1
    YODASB2

  Properties:
    DGConnectIdentifier             = 'YODASB'
    ObserverConnectIdentifier       = ''
    LogXptMode                      = 'ASYNC'
    RedoRoutes                      = ''
    DelayMins                       = '0'
    Binding                         = 'optional'
    MaxFailure                      = '0'
    MaxConnections                  = '1'
    ReopenSecs                      = '300'
    NetTimeout                      = '30'
    RedoCompression                 = 'DISABLE'
    LogShipping                     = 'ON'
    PreferredApplyInstance          = ''
    ApplyInstanceTimeout            = '0'
    ApplyLagThreshold               = '0'
    TransportLagThreshold           = '0'
    TransportDisconnectedThreshold  = '30'
    ApplyParallel                   = 'AUTO'
    StandbyFileManagement           = 'AUTO'
    ArchiveLagTarget                = '900'
    LogArchiveMaxProcesses          = '8'
    LogArchiveMinSucceedDest        = '1'
    DbFileNameConvert               = ''
    LogFileNameConvert              = ''
    FastStartFailoverTarget         = ''
    InconsistentProperties          = '(monitor)'
    InconsistentLogXptProps         = '(monitor)'
    SendQEntries                    = '(monitor)'
    LogXptStatus                    = '(monitor)'
    RecvQEntries                    = '(monitor)'
    StaticConnectIdentifier(*)
    StandbyArchiveLocation(*)
    AlternateLocation(*)
    LogArchiveTrace(*)
    LogArchiveFormat(*)
    TopWaitEvents(*)
    (*) - Please check specific instance for the property value

Database Status:
SUCCESS
&lt;/pre&gt;

&lt;p&gt;Le fichier alert.log de la base montre cette modification&lt;/p&gt;
&lt;pre&gt;
...
2018-06-07 11:05:54.328000 +02:00
ALTER SYSTEM SET archive_lag_target=900 SCOPE=BOTH SID='*';
...
&lt;/pre&gt;

&lt;h3&gt;Configuration de services&lt;/h3&gt;

&lt;p&gt;Le principe général est de démarrer les services uniquement quand la base est primaire. Sur chaque envrionnement il faut donc créer les services en indiquant la clause -role PRIMARY. Ici on met en place 3services&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;YODA_APS : Load Balancing&lt;/li&gt;
&lt;li&gt;YODA_BAS1 : sur noeud 1 et failover sur noeud 2&lt;/li&gt;
&lt;li&gt;YODA_BAS2 : sur noeud 2 et failover sur noeud 1&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Sur base primaire YODASB&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
srvctl add service -db YODASB -service YODA_APS -preferred YODASB1,YODASB2 -role PRIMARY
srvctl add service -db YODASB -service YODA_BAS1 -preferred YODASB1 -available YODASB2 -role PRIMARY
srvctl add service -db YODASB -service YODA_BAS2 -preferred YODASB2 -available YODASB1 -role PRIMARY
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Sur base standby YODASA&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
srvctl add service -db YODASA -service YODA_APS -preferred YODASA1,YODASA2 -role PRIMARY
srvctl add service -db YODASA -service YODA_BAS1 -preferred YODASA1 -available YODASA2 -role PRIMARY
srvctl add service -db YODASA -service YODA_BAS2 -preferred YODASA2 -available YODASA1 -role PRIMARY
&lt;/pre&gt;</description>

    

      </item>
  
  <item>
    <title>Monitoring RMAN</title>
    <link>http://www.silverlake.fr/index.php?post/2018/03/07/Monitoring-RMAN</link>
    <guid isPermaLink="false">urn:md5:8e5e8ef81d0957fc3f4efdd22b0837fc</guid>
    <pubDate>Wed, 07 Mar 2018 09:12:00 +0100</pubDate>
    <dc:creator>Silverlake</dc:creator>
        <category>Oracle</category>
        
    <description>    &lt;p&gt;Les sauvegardes et restaurations RMAN sont parfois longues et le Recovery MANager n'est pas toujours très bavard. les requêtes suivantes sont utiles afin de suivre l'avancement du processus.&lt;/p&gt;


&lt;p&gt;Cette requête permet de suivre l'avancement et surtout de déterminer une date de fin approximative.&lt;/p&gt;
&lt;pre&gt;
alter session set nls_date_format='dd/mm/yy hh24:mi:ss';

set linesize 250
col dbsize_mbytes      for 99,999,990.00 justify right head &amp;quot;TailleDB_MB&amp;quot;
col input_mbytes       for 99,999,990.00 justify right head &amp;quot;Lecture_MB&amp;quot;
col output_mbytes      for 99,999,990.00 justify right head &amp;quot;Ecriture_MB&amp;quot;
col output_device_type for a10           justify left head &amp;quot;DEVICE&amp;quot;
col complete           for 990.00        justify right head &amp;quot;COMPLETE %&amp;quot;
col compression        for 990.00        justify right head &amp;quot;COMPRESS|% ORIG&amp;quot;
col est_complete       for a20           head &amp;quot;Fin estimée&amp;quot;
col recid              for 9999999       head &amp;quot;ID&amp;quot;

select recid, output_device_type, dbsize_mbytes, input_bytes/1024/1024 input_mbytes, output_bytes/1024/1024 output_mbytes, 
(output_bytes/input_bytes*100) compression, 
(mbytes_processed/dbsize_mbytes*100) complete, 
to_char(start_time + (sysdate-start_time)/(mbytes_processed/dbsize_mbytes),'DD-MON-YYYY HH24:MI:SS') est_complete
from v$rman_status rs, (select sum(bytes)/1024/1024 dbsize_mbytes from v$datafile)
where status='RUNNING'  and output_device_type is not null;
&lt;/pre&gt;

&lt;p&gt;Ci dessous un exemple&lt;/p&gt;
&lt;pre&gt;
                                                                 COMPRESS
      ID DEVICE        TailleDB_MB     Lecture_MB    Ecriture_MB   % ORIG COMPLETE % Fin estimée
-------- ---------- -------------- -------------- -------------- -------- ---------- --------------------
    9791 DISK         1,173,192.67     212,822.94      59,460.00    27.94      18.14 07-MAR-2018 17:28:28
&lt;/pre&gt;

&lt;p&gt;Les requêtes suivantes permettent également de suivre le processus phase par phase. La seconde donne les événements d'attente.&lt;/p&gt;
&lt;pre&gt;
select SID, START_TIME,TOTALWORK, sofar, (sofar/totalwork) * 100 done,
sysdate + TIME_REMAINING/3600/24 &amp;quot;Fin à&amp;quot;
from v$session_longops
where totalwork &amp;gt; sofar
AND opname NOT LIKE '%aggregate%'
AND opname like 'RMAN%';

column sid format 9999
column spid format 99999
column client_info format a25
column event format a30
column secs format 9999
SELECT SID, SPID, CLIENT_INFO, event, seconds_in_wait secs, p1, p2, p3
  FROM V$PROCESS p, V$SESSION s
  WHERE p.ADDR = s.PADDR
  and CLIENT_INFO like 'rman channel=%';
&lt;/pre&gt;

&lt;p&gt;En complément voici comment connaitre la volumétrie prise par les sauvegardes&lt;/p&gt;
&lt;pre&gt;
select ctime &amp;quot;Date&amp;quot;, 
decode(backup_type, 'L', 'Archive Log', 'D', 'Full', 'Incremental') &amp;quot;Type Sauvegarde&amp;quot;, 
bsize &amp;quot;Taille MB&amp;quot;
from (select trunc(bp.completion_time) ctime, backup_type, round(sum(bp.bytes/1024/1024),2) bsize
       from v$backup_set bs, v$backup_piece bp
       where bs.set_stamp = bp.set_stamp
       and bs.set_count  = bp.set_count
       and bp.status = 'A'
       group by trunc(bp.completion_time), backup_type)
order by 1, 2;
&lt;/pre&gt;</description>

    

      </item>
  
  <item>
    <title>Creation d'un base de données Stand-Alone</title>
    <link>http://www.silverlake.fr/index.php?post/2018/01/14/Creation-d-un-base-de-donn%C3%A9es-Stand-Alone</link>
    <guid isPermaLink="false">urn:md5:4a3e9dd8f6f054538a9df72a3773dd9f</guid>
    <pubDate>Sun, 14 Jan 2018 11:10:00 +0100</pubDate>
    <dc:creator>Silverlake</dc:creator>
        <category>Oracle</category>
        
    <description>    &lt;h3&gt;Introduction&lt;/h3&gt;

&lt;p&gt;Dans un précédent billet il fut présenté un script de création d'une base Oracle 12c sur un cluster RAC à 2 noeuds. Ici il s'agit d'un script basé sur le même modèle mais pour la création d'une base en mode stand-alone de type non-CDB ( pas de pluggable database ).&lt;/p&gt;


&lt;p&gt;La version de Oracle en place est 12.2.0.1 l'adaptation à une autre version est simple, il suffit de modifier la variable ORACLE_HOME. Le script fonctionne en 11gR2 et 12c sans difficulté.&lt;/p&gt;

&lt;h3&gt;Présentation du script.&lt;/h3&gt;

&lt;p&gt;Celui-comporte en début un certain nombre de variables qu'il suffit de personnaliser, notamment le nom de la base et l'emplacement des fichiers et aussi des tailles SGA et PGA.&lt;/p&gt;


&lt;p&gt;Les variables ORACLE_BASE et ORACLE_HOME respectent la norme OFA.&lt;/p&gt;


&lt;p&gt;La gestion des fichiers est assurée en mode OMF.&lt;/p&gt;


&lt;p&gt;Il est nécessaire de créer un répertoire $HOME/sql avant lancement.&lt;/p&gt;

&lt;pre&gt;
######################################################
# Shell de creation d'une base Stand-Alone
# SILVERLAKE : 12/01/2018
# Note : Deux fichiers ( init&amp;lt;SID&amp;gt;.ora et create&amp;lt;SID&amp;gt;.sql ) sont ecrits sous $HOME/sql
# Appel : createBASE.sh
######################################################
#!/bin/bash

if [ -z ${ORACLE_BASE} ]
then
  export ORACLE_BASE=/ora01/app/oracle
fi

if [ -z ${ORACLE_HOME} ]
then
  export ORACLE_HOME=${ORACLE_BASE}/product/12.2.0.1/DB
  export PATH=$ORACLE_HOME/bin:$PATH
fi

export DEBUT=$(date +%s)
echo $(date)

# Variables a spécifier
export DB=YODA
export DBUNIQ=${DB}
export ORACLE_SID=${DBUNIQ}
export DATA=${ORACLE_BASE}/oradata
export FRA=${ORACLE_BASE}/fast_recovery_area
export SGA=1280M
export PGA=360M
export MDP=Manager12#
export SERVEUR1=ona01.formation.maison

echo &amp;quot;Suppression ancienne BASE&amp;quot;
rm -rf ${DATA}/${DBUNIQ}
rm -rf ${FRA}/${DBUNIQ}

mkdir -p ${DATA}
mkdir -p ${FRA}

echo &amp;quot;Création base Stand-Alone ${DBUNIQ} sur ${SERVEUR1}&amp;quot;

# Fichier init.ora
# A adapter selon le besoin
cat &amp;lt;&amp;lt;EOF &amp;gt; ${HOME}/sql/init${DB}.ora
db_name=${DB}
db_block_size=8192
db_create_file_dest=${DATA}
db_recovery_file_dest=${FRA}
db_recovery_file_dest_size=5000M
log_archive_format=${DB}_%t_%s_%r.arch
sga_target=${SGA}
pga_aggregate_target=${PGA}
EOF

# Script de creation
# A adapter, notamment dimension des tablespaces standards ( SYSTEM,SYSAUX,TEMP,UNDO,USERS )
# Le tablespace USERS est volontairement cree et bloque a 100K
cat &amp;lt;&amp;lt;EOF &amp;gt; ${HOME}/sql/create${DB}.sql
create database ${DB}
character set AL32UTF8
national character set AL16UTF16
datafile size 500M autoextend on next 500M maxsize 2G extent management local
sysaux datafile size 500M autoextend on next 500M maxsize 2G
undo tablespace UNDOTBS1 datafile size 500M
default temporary tablespace TEMP tempfile size 500M
default tablespace USERS datafile size 100K
logfile group 1 size 50M,
        group 2 size 50M,
        group 3 size 50M
user sys identified by &amp;quot;${MDP}&amp;quot;
user system identified by &amp;quot;${MDP}&amp;quot;;
EOF

ln -sfn ${HOME}/sql/init${DB}.ora ${ORACLE_HOME}/dbs/init${DB}.ora

# Creation de la base
echo &amp;quot;Création de l'instance et des fichiers principaux&amp;quot;
resultat=`sqlplus -s &amp;quot;/ as sysdba&amp;quot; &amp;lt;&amp;lt;EOF
create spfile from pfile;
startup force nomount;
start ${HOME}/sql/create${DB}.sql;
exit;
EOF`

echo &amp;quot;Base de données ${DBUNIQ} créee. Les fichiers de contrôle sont en place.&amp;quot;

echo &amp;quot;Création des vues du dictionnaire. Phase assez longue&amp;quot;
resultat=`sqlplus -s &amp;quot;/ as sysdba&amp;quot; &amp;lt;&amp;lt;EOF
@?/rdbms/admin/catalog.sql
@?/rdbms/admin/catproc.sql

BEGIN
 FOR item IN ( SELECT USERNAME FROM DBA_USERS WHERE ACCOUNT_STATUS IN ('OPEN', 'LOCKED', 'EXPIRED') AND USERNAME NOT IN (
'SYS','SYSTEM') )
 LOOP
  dbms_output.put_line('Locking and Expiring: ' || item.USERNAME);
  execute immediate 'alter user ' ||
         sys.dbms_assert.enquote_name(
         sys.dbms_assert.schema_name(
         item.USERNAME),false) || ' password expire account lock' ;
 END LOOP;
END;
/

connect system/${MDP}
@?/sqlplus/admin/pupbld.sql
@?/sqlplus/admin/help/hlpbld.sql helpus.sql
exit;
EOF

# la base est mise en archivelog.
# Commenter ces instructions en cas de non archivelog.
`resultat=`sqlplus -s &amp;quot;/ as sysdba&amp;quot; &amp;lt;&amp;lt;EOF
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
alter system archive log current;
exit;
EOF`

echo ${DBUNIQ}':'${ORACLE_HOME}':Y' &amp;gt;&amp;gt; /etc/oratab

export FIN=$(date +%s)
echo $(date)
export DUREE=$(( ${FIN} - ${DEBUT} ))
echo &amp;quot;Fin de création. Durée -&amp;gt; ${DUREE}&amp;quot;
exit 0
&lt;/pre&gt;

&lt;p&gt;Le script est suffisamment auto-commenté pour être adapté ou amélioré. Par exemple il peut être intéressant de passer en paramètre le nom de la base.&lt;/p&gt;


&lt;p&gt;Dans un prochain billet le même script sera adapté pour utiliser le mode CDB soit Pluggable Database.&lt;/p&gt;</description>

    

      </item>
  
  <item>
    <title>Informations sur les sauvegardes RMAN</title>
    <link>http://www.silverlake.fr/index.php?post/2017/11/16/Informations-sur-les-sauvegardes-RMAN</link>
    <guid isPermaLink="false">urn:md5:2326c5ac42b68045f629802e22259ae6</guid>
    <pubDate>Thu, 16 Nov 2017 09:04:00 +0100</pubDate>
    <dc:creator>Silverlake</dc:creator>
        <category>Oracle</category>
        
    <description>    &lt;p&gt;Il est intéressant de connaitre la durée et le volume des sauvegardes RMAN. La vue &lt;strong&gt;v$rman_backup_job_details&lt;/strong&gt; permet de retrouver facilement un bon nombre d'informations. la requête présentée ici  donne le type de sauvegarde : archivelog ou base ainsi que la durée en heures et le volume.&lt;/p&gt;
&lt;pre&gt;
select input_type,status,
to_char(start_time,'DD/MM/YYYY HH24:MI' ) Debut,
to_char(end_time,'DD/MM/YYYY HH24:MI' ) Fin,
round( elapsed_seconds/3600,2) &amp;quot;Durée en Hrs&amp;quot;,
round(input_bytes/1024/1024/1024,2) &amp;quot;Volume Données (Go)&amp;quot;,
round(output_bytes/1024/1024/1024,2) &amp;quot;Taille Sauvegarde (Go)&amp;quot;,
output_device_type &amp;quot;Média&amp;quot;
from v$rman_backup_job_details
order by session_key;
&lt;/pre&gt;</description>

    

      </item>
  
  <item>
    <title>Fonctionnalité In-Database Archiving Oracle 12c</title>
    <link>http://www.silverlake.fr/index.php?post/2017/11/03/Fonctionnalit%C3%A9-In-Database-Archiving-Oracle-12c</link>
    <guid isPermaLink="false">urn:md5:a4997fbd9bd6fa02e23baa293dc2a8c7</guid>
    <pubDate>Fri, 03 Nov 2017 09:49:00 +0100</pubDate>
    <dc:creator>Silverlake</dc:creator>
        <category>Oracle</category>
        
    <description>    &lt;p&gt;La version 12c de oracle Database a introduit une fonctionnalité intéressante vis à vis des données dites d'archives. Il est en effet courant de stocker des milliers, voir des millions de lignes dans des tables et qui ne sont jamais ou très peu utilisées. Ceci peut être particulièrement gênant dans le cas d'une recherche où seules les informations récentes sont souhaitées.&lt;/p&gt;


&lt;p&gt;Pour palier à ceci il est fréquent de positionner dans la table un flag disant que l'on prend en compte la ligne ou pas. La fonction In-Database Archiving ou IDA gère ceci de manière plus souple.&lt;/p&gt;


&lt;p&gt;Soit la table suivante :&lt;/p&gt;
&lt;pre&gt;
create table personne ( code char(2), prenom char(15), constraint personne_pk primay key ( code));
insert into personne values ('01','Alice');
insert into personne values ('02','Bob');
insert into personne values ('03','Carmen');
commit;
&lt;/pre&gt;

&lt;p&gt;Ici la ligne 03 - Carmen va être jugée non pertinente pour les recherches. Dans le concept IDA les données sont déclarées soit actives, soit archivées. Une donnée marquée archivée devient invisible pour l'application et est stockée sous forme compressée. L'activation est simple soit à la création de la table:&lt;/p&gt;
&lt;pre&gt;
create table personne ( code char(2), prenom char(15), constraint client_pk primary key (code)) row archival;
&lt;/pre&gt;

&lt;p&gt;Soit à postériori&lt;/p&gt;
&lt;pre&gt;
alter table personne row archival;
&lt;/pre&gt;

&lt;p&gt;La commande suivante désactive ce mode&lt;/p&gt;
&lt;pre&gt;
alter table personne no row archival;
&lt;/pre&gt;

&lt;p&gt;L'activation ajoute une colonne de plus à la table (ORA_ARCHIVE_STATE ) . Cette colonne n'est toutefois pas visible par la commande DESC, il faut interroger la table USER_TAB_COLS.&lt;/p&gt;
&lt;pre&gt;
SELECT column_id, column_name, data_type, data_length, hidden_column
FROM   user_tab_cols
WHERE  table_name = 'PERSONNE'
ORDER BY column_id

 COLUMN_ID COLUMN_NAME		DATA_TYPE	     DATA_LENGTH HIDDEN_CO
---------- -------------------- -------------------- ----------- ---------
	 1 CODE 		CHAR			       2 NO
	 2 PRENOM		CHAR			      15 NO
	   SYS_NC00003$ 	RAW			     126 YES
	   ORA_ARCHIVE_STATE	VARCHAR2		    4000 YES
&lt;/pre&gt;

&lt;p&gt;Par défaut la valeur de ORA_ARCHIVE_STATE est à &quot;0&quot;&lt;/p&gt;
&lt;pre&gt;
select ora_archive_state, count(*) from personne group by ora_archive_state;

ORA   COUNT(*)
--- ----------
0	     3
&lt;/pre&gt;

&lt;p&gt;L'exemple suivant présente la fonctionnalité.&lt;/p&gt;
&lt;pre&gt;
select * from personne;

CODE   PRENOM
------ ---------------------------------------------
01     Alice
02     Bob
03     Carmen
&lt;/pre&gt;

&lt;p&gt;Il peut au premier abord évident d'utiliser ceci pour archiver la ligne code = '03' par exemple : &lt;em&gt;update personne set ora_archive_state='1' where code='03';&lt;/em&gt; Il est conseillé toutefois de ne pas utiliser un update simple comme ici mais de passer par le package. dbms_ilm et la fonction archivestatename.&lt;/p&gt;
&lt;pre&gt;
update personne set ora_archive_state=dbms_ilm.archivestatename(1) where code='03';
commit;
select * from personne;

CODE   PRENOM
------ ---------------------------------------------
01     Alice
02     Bob

select ora_archive_state, count(*) from personne group by ora_archive_state;

ORA_ARCHIVE_STATE  COUNT(*)
-----------------  --------
1	                 1
0	                 2
&lt;/pre&gt;

&lt;p&gt;Pour voir les lignes archivées il faut demander la visibilité de toutes les lignes&lt;/p&gt;
&lt;pre&gt;
alter session set row archival visibility=all;
select * from personne;

CODE   PRENOM
------ ---------------------------------------------
01     Alice
02     Bob
03     Carmen
&lt;/pre&gt;

&lt;p&gt;Si on souhaite modifier l'état pour la ligne code '03' il faut au préalable activer la visibilité. La commande suivante réactive l'invisibilité des lignes archivées.&lt;/p&gt;
&lt;pre&gt;
alter session set row archival visibility=active;
select * from personne;

CODE   PRENOM
------ ---------------------------------------------
01     Alice
02     Bob
&lt;/pre&gt;

&lt;p&gt;Attention cette fonctionnalité ne fonctionne que sur le bases non-CDB en 12.1, par contre elle est étendue au CDB en version 12.2.&lt;/p&gt;</description>

    

      </item>
  
  <item>
    <title>Channel bonding et VirtualBox</title>
    <link>http://www.silverlake.fr/index.php?post/2017/07/30/Channel-bonding-et-VirtualBox</link>
    <guid isPermaLink="false">urn:md5:24dba22dd97daca23c8c0919e9922847</guid>
    <pubDate>Sun, 30 Jul 2017 11:13:00 +0200</pubDate>
    <dc:creator>Silverlake</dc:creator>
        <category>Linux</category>
        
    <description>    &lt;p&gt;Le channel bonding ou agrégation de lien permet de configurer deux cartes réseau vue comme une seule.  Chaque carte est reliée à un port du switch selon le schéma ci-dessous. L'objectif ici n'est pas de détailler la configuration channel bonding qui est largement référencée sur le Net, mais d'apporter une précision en cas d'utilisation de VM VirtualBox.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.silverlake.fr/public/Capture_du_2017-07-30_17-19-08.png&quot; alt=&quot;Capture_du_2017-07-30_17-19-08.png&quot; title=&quot;Capture_du_2017-07-30_17-19-08.png, juil. 2017&quot; /&gt;&lt;/p&gt;


&lt;p&gt;La mise en place du channel bonding sous RedHat 7 n'est pas complexe il suffit de créer 3 fichiers sous /etc/sysconfig/network-scripts.  Il faut toutefois prendre une précaution avec VirtualBox :  La clause &lt;strong&gt;fail_over_mac=1&lt;/strong&gt; est impérative en mode active-backup afin d'assurer le basculement correct de la MAC address.  Sans cette option en cas de défaillance de la carte principale il faut redemarrer le service réseau manuellement.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;ifcfg-bond0&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
DEVICE=bond0
BONDING_MASTER=yes
BOOTPROTO=none
ONBOOT=yes
BROADCAST=192.168.56.255
NETWORK=192.168.56.0
BONDING_OPTS=&amp;quot;miimon=100 mode=active-backup fail_over_mac=1&amp;quot;
IPADDR=192.168.56.41
PREFIX=24
GATEWAY=192.168.56.1
DNS1=192.168.56.11
DOMAIN=formation.maison
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;ifcfg-enp0s3&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
DEVICE=enp0s3
ONBOOT=yes
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;ifcfg-enp0s8&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
DEVICE=enp0s8
ONBOOT=yes
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
&lt;/pre&gt;

&lt;p&gt;Test channel bonding, fonctionnement normal enp0s3 est la carte active ( MAC address de bond0 : 08:00:27:05:44:79 ) .&lt;/p&gt;
&lt;pre&gt;
ip addr

...
2: enp0s3: &amp;lt;BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 1000
    link/ether 08:00:27:05:44:79 brd ff:ff:ff:ff:ff:ff
...
5: enp0s8: &amp;lt;BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 1000
    link/ether 08:00:27:d6:29:b5 brd ff:ff:ff:ff:ff:ff
6: bond0: &amp;lt;BROADCAST,MULTICAST,MASTER,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether 08:00:27:05:44:79 brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.41/24 brd 192.168.56.255 scope global bond0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe05:4479/64 scope link 
       valid_lft forever preferred_lft forever
&lt;/pre&gt;

&lt;p&gt;Déconnexion de enp0s3, la carte active devient enp0s8 ( MAC address de bond0 : 08:00:27:d6:29:b5 )&lt;/p&gt;
&lt;pre&gt;
ip addr

...
2: enp0s3: &amp;lt;NO-CARRIER,BROADCAST,MULTICAST,SLAVE,UP&amp;gt; mtu 1500 qdisc pfifo_fast master bond0 state DOWN qlen 1000
    link/ether 08:00:27:05:44:79 brd ff:ff:ff:ff:ff:ff
...
5: enp0s8: &amp;lt;BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 1000
    link/ether 08:00:27:d6:29:b5 brd ff:ff:ff:ff:ff:ff
6: bond0: &amp;lt;BROADCAST,MULTICAST,MASTER,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether 08:00:27:d6:29:b5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.41/24 brd 192.168.56.255 scope global bond0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe05:4479/64 scope link 
       valid_lft forever preferred_lft forever
&lt;/pre&gt;</description>

    

      </item>
  
</channel>
</rss>
