17 Şubat 2020 Pazartesi

vSphere Replication ile replike olan olan bir VM 'in CLI ortamında replikasyondan ayrıştırılması.

Merhaba,

Herhangi bir sebepten dolayı vSphere Replication’da resimde görülen hatalar gibi hatalar oluştuysa yada Target DS içinden bir şekilde replike olan VM’in verisini sildiyseniz ve vSphere içinden ilgili VM’I ReConfigure edemiyorsanız aşağıdaki adımları izlemek işinizi çözecektir.

 

 

 

 

 

 

eSXi sunucuya CLI ortamında bağlantı yaparak operasyon yapacağımız sunucun ID sini öğreneceğiz.

 

vim-cmd vmsvc/getallvms |grep "XYZServer"

 

çıktı olarak alttaki gibi bir çıktı elde edeceğiz.

 

295    XYZServer               [AFA_Comp_DS] XYZServer/XYZServer.vmx                           windows7Server64Guest   vmx-11

 

Sunucumuzun ID si çıktıya göre 295 dir. Bu bilgiyi öğrendikten sonra aşağıdaki komutu yazarak replikasyonun Disk statü ve aksiyonlarını görmeyi hedefliyoruz.

 

vim-cmd hbrsvc/vmreplica.getState 295

 

çıktı olarak aşağıdaki gibi bir çıktı elde edilir.

 

 

Retrieve VM running replication state:

        The VM is configured for replication. Current replication state: Group: GID-d8ce20e8-f799-4a79-a1b8-7c9d89b12c01 (generation=7292397286522810)

        Group State: inactive, paused

                DiskID RDID-02f2d250-68b0-48f0-93c7-1c8c93a0afe0 State: inactive, paused

                DiskID RDID-7f406ea4-91a3-4549-95e3-aa61fbc34595 State: inactive, paused

                DiskID RDID-6ba702b4-0ecb-470d-b955-bd5cca6ffbdc State: inactive, paused

                DiskID RDID-f2aee2be-be9a-4829-8805-8a1fa3c920fd State: inactive, paused

                DiskID RDID-5a4545da-b03a-4f85-a071-e34a757a9b7c State: inactive, paused

                DiskID RDID-11fc6b9c-11ab-4927-b5c5-724d5ddfbd0c State: inactive, paused

 

 

Son olarak alttaki komutla replikasyonu Disabled etmeye çalışıyoruz.

 

vim-cmd hbrsvc/vmreplica.disable 295

 

Bu komut sonrası alttaki gibi bir çıktı elde etmeniz gerekiyor.

 

Disable VM Replication:

 

Bu operasyonlar sonra tekrardan GUI ortamına döndüğümüzde ilgili sunucu üzerine sağ tıklarsak önceden Reconfigure aktifken artık Configure nin ektif olduğunu görebilirsiniz.

 

               

 

 

Ümit GÖRÜR

Profesyonel Hizmetler | Professional Services

 

Yıldız Teknik Üniversitesi Davutpaşa Kampüsü Teknoloji Geliştirme Bölgesi Çiftehavuzlar Mahallesi Eski Londra Asfaltı Caddesi No: 151/1E D2 Blok

Ofis No: 1B-10 Esenler - İstanbul, TÜRKİYE

T: +90 (212) 393 00 90 | F: +90 (212) 393 00 91

www.aktekbilisim.com


 

 


Read more...

16 Şubat 2020 Pazar

vCenter backup & restore script

vCenter Postgre DB yedeğini almak için aşağıdaki adımlar izlenebilir. Script içeriklerinde bir değişiklik yapmanıza gerek yoktur. Sarı alanları kopyalayıp bir editöre yapıştırmanız ve kaydetmeniz yeterli olacaktır.

 

 

backup_lin.py script içeriği

 

#!/usr/bin/env python

 

import argparse

from os import path, remove, close

from subprocess import call, Popen, PIPE

 

POSTG_BIN_DIR  = "/opt/vmware/vpostgres/current/bin/"

PSQL           = path.join(POSTG_BIN_DIR, "psql")

PG_DUMP        = path.join(POSTG_BIN_DIR, "pg_dump")

 

parser = argparse.ArgumentParser()

parser.add_argument('-f',

                    action="store",

                    dest="backup_file",

                    required=True)

results = parser.parse_args()

 

fileOut = open("/tmp/backup_out.log", "a+")

fileError = open("/tmp/backup_err.log", "a+")

 

cmd = [PG_DUMP, "-a", "-Fc", "--disable-triggers", "-b", "-U", "postgres", "-f", results.backup_file, "VCDB"]

ret = call(cmd, stdout=fileOut, stderr=fileError)

fileOut.close()

fileError.close()

 

print ("Backup completed successfully.")

 

 

python script dosyasına yetki veriyoruz. chmod 700 /tmp/backup_lin.py sonrasında python backup_lin.py -f /tmp/vcsa_postgres_VCDB_12022020.bak konutu ile DB yedeklernir. Sarı ile işaretli dizilimde kırmızı puntolar ile yazılan kısım sizin vereceğiniz bir isimlendirme olabilir. Backup completed successfully. Yazısını gördükten sonra yedeğinizin alındığını anlayabilirsiniz.   

 

 

işlerin yolunda gitmediğini düşünerek birde restore için script oluşturulalım. Bu script’in adıda restore_lin.py olsun. Script Içeriği aşağıdaki gibi olmalı.

 

restore_lin.py script içeriği

 

 

#!/usr/bin/env python

 

import argparse

import time

import sys

from os import path, remove, close

from subprocess import call, Popen, PIPE

 

VPOSTGRES_FOLDER  = "/opt/vmware/vpostgres/current/"

PSQL              = path.join(VPOSTGRES_FOLDER, "bin", "psql")

PG_RESTORE        = path.join(VPOSTGRES_FOLDER, "bin", "pg_restore")

 

constrfilename = "create_constr" + time.strftime("%Y%m%d%H%M%S%m") + ".sql"

indexfilename = "create_index" + time.strftime("%Y%m%d%H%M%S%m") + ".sql"

 

CREATE_INDEXES = ("/tmp/" + indexfilename)

CREATE_CONSTRAINTS = ("/tmp/" + constrfilename)

 

def psqlFile(filePath, userName = "postgres", database = "VCDB"):

   return [PSQL, "-U", userName, "-d", database, "-q", "-f", filePath]

 

def psqlQuery(query, userName = "postgres", database = "VCDB"):

   return [PSQL, "-U", userName, "-d", database, "-q", "-t", "-c", query]

 

def execPsqlDynamicSql(sql):

   '''

   Executes dynamic sql query which is generated by the input

 

   @sql: input for dynamic query

   '''

   pipe1 = Popen(psqlQuery(sql), stdout = PIPE)

   cmd2 = [PSQL, "-U", "postgres", "-d", "VCDB"]

   pipe2 = Popen(cmd2, stdin = pipe1.stdout, stdout = PIPE)

   pipe1.stdout.close()

   pipe2.communicate()

   pipe2.stdout.close()

 

def preImportScripts(schemaName):

   '''

   VCDB index and constraint drop and create into files.

   When completed drop all indexes and constraints.

   This step is required for faster import.

 

   @schemaName: vPostgres VCDB schema name

   '''

   sqlTblsp =  """

               CASE

                  WHEN c.relname LIKE 'vpx_alarm%'

                     THEN 'SET default_tablespace = alarm; '

                  WHEN c.relname LIKE 'vpx_event%'

                     THEN 'SET default_tablespace = event; '

                  WHEN c.relname LIKE 'vpx_task%'

                     THEN 'SET default_tablespace = task;'

                  WHEN c.relname LIKE 'vpx_hist_stat1%'

                     THEN 'SET default_tablespace = hs1;'

                  WHEN c.relname LIKE 'vpx_hist_stat2%'

                     THEN 'SET default_tablespace = hs2;'

                  WHEN c.relname LIKE 'vpx_hist_stat3%'

                     THEN 'SET default_tablespace = hs3;'

                  WHEN c.relname LIKE 'vpx_hist_stat4%'

                     THEN 'SET default_tablespace = hs4;'

                  ELSE ''

               END

               """

   sqlResetTblsp = """

                   CASE

                     WHEN c.relname LIKE 'vpx_alarm%'

                       OR c.relname LIKE 'vpx_event%'

                       OR c.relname LIKE 'vpx_task%'

                       OR c.relname LIKE 'vpx_hist_stat%'

                           THEN 'RESET default_tablespace;'

                     ELSE ''

                   END

                   """

   sqlCreateIndex =  """

                     SELECT %s || pg_catalog.pg_get_indexdef(i.indexrelid, 0, true) || ';' || %s

                       FROM pg_class c

                       JOIN pg_index i

                         ON c.oid = i.indrelid

                       JOIN pg_class c2

                         ON i.indexrelid = c2.oid

                       JOIN pg_namespace n

                         ON n.oid=c.relnamespace

                            AND nspname = '%s'

                       LEFT JOIN pg_catalog.pg_constraint con

                         ON con.conrelid = i.indrelid

                            AND con.conindid = i.indexrelid

                            AND con.contype IN ('p','u','x')

                      WHERE NOT EXISTS(SELECT 1

                                         FROM pg_constraint

                                        WHERE  conname = c2.relname)

                     """ % (sqlTblsp, sqlResetTblsp, schemaName)

   sqlCreateConstr = """

                     SELECT 'ALTER TABLE ' || c.relname||

                              ' ADD CONSTRAINT ' || con.conname ||

                                 ' ' || pg_get_constraintdef(con.oid)||';' ||

                                 CASE  WHEN i.indisclustered='t'

                                       THEN ' cluster ' || c.relname|| ' using ' || con.conname || ';'

                                       ELSE ''

                                 END

                       FROM pg_constraint con

                       JOIN pg_class c

                         ON con.conrelid = c.oid

                       JOIN pg_namespace n

                         ON n.oid = c.relnamespace

                       LEFT JOIN pg_index i

                         ON con.conrelid = i.indrelid

                         AND con.conindid = i.indexrelid

                      WHERE n.nspname = '%s'

                      ORDER BY con.contype DESC

                     """ % (schemaName)

   sqlDropIndex = """

                  SELECT 'DROP INDEX IF EXISTS ' || c.relname || ' CASCADE;'

                    FROM pg_class c

                    LEFT JOIN pg_namespace n

                      ON n.oid = c.relnamespace

                   WHERE c.relkind IN ('i','')

                     AND n.nspname = '%s'

                     AND pg_table_is_visible(c.oid)

                     AND NOT EXISTS(SELECT 1

                                      FROM pg_constraint

                                     WHERE conname = c.relname)

                  """ % (schemaName)

   sqlDropConstr =   """

                     SELECT 'ALTER TABLE ' || relname ||

                              ' DROP CONSTRAINT IF EXISTS ' || conname || ' CASCADE;'

                       FROM pg_constraint con

                       JOIN pg_class c

                         ON con.conrelid = c.oid

                       JOIN pg_namespace n

                         ON n.oid = c.relnamespace

                      WHERE n.nspname = '%s'

                     """ % (schemaName)

   sqlTrunc =  """

               SELECT 'TRUNCATE TABLE ' || c.relname || ' CASCADE;'

                 FROM pg_class c

                 JOIN pg_namespace n

                   ON n.oid = c.relnamespace

                WHERE c.relkind = 'r'

                  AND n.nspname = '%s'

                  AND pg_table_is_visible(c.oid)

               """ % (schemaName)

   with open(CREATE_INDEXES, "w") as f:

      ret = call(psqlQuery(sqlCreateIndex), stdout=f, stderr=fileError)

   print ("Saved Indexes from target DB to file %s." % (CREATE_INDEXES))

   with open(CREATE_CONSTRAINTS, "w") as f:

      ret = call(psqlQuery(sqlCreateConstr), stdout=f, stderr=fileError)

   print ("Saved Constraints from target DB to file %s." %(CREATE_CONSTRAINTS))

   execPsqlDynamicSql(sqlDropIndex)

   print ("Dropped Indexes in target DB.")

   execPsqlDynamicSql(sqlDropConstr)

   print ("Dropped Constraints in target DB.")

   execPsqlDynamicSql(sqlTrunc)

   print ("Truncated all tables in target DB.")

def postImportScripts():

   '''

   Recreate indexes and constraints after data import.

   '''

   ret = call(psqlFile(CREATE_INDEXES), stdout=fileOut, stderr=fileError)

   print ("Recreated Indexes back in target DB from file %s." % (CREATE_INDEXES))

   ret = call(psqlFile(CREATE_CONSTRAINTS), stdout=fileOut, stderr=fileError)

   print ("Recreated Constraints back in target DB from file %s." % (CREATE_CONSTRAINTS))

 

print ("Operation not cancellable. Please wait for it to finish...")

 

parser = argparse.ArgumentParser()

parser.add_argument('-f',

                    action="store",

                    dest="backup_file",

                    required=True)

results = parser.parse_args()

 

fileOut = open("/tmp/restore_out.log", "a+")

fileError = open("/tmp/restore_err.log", "a+")

 

sql = """

      SELECT nspname

        FROM pg_namespace

       WHERE nspname in ('vc', 'vpx')

      """

 

pipe = Popen(psqlQuery(sql), stdout = PIPE)

schemaName = pipe.communicate()[0].strip()

pipe.stdout.close()

 

if sys.version_info[0] > 2:

   schemaName=schemaName.decode()

 

fileOut.write("Running pre-import scripts...\n")

preImportScripts(schemaName)

fileOut.write("Pre-import step completed.\n")

 

cmd = [PG_RESTORE, "-a", "-Fc", "--disable-triggers", "-U", "postgres", "-d", "VCDB", results.backup_file]

ret = call(cmd, stdout=fileOut, stderr=fileError)

 

fileOut.write("Running post-import scripts...\n")

postImportScripts()

fileOut.write("Post-import step completed.\n")

fileOut.close()

fileError.close()

 

print ("Restore completed successfully.")

 

 

Bu script ‘e çalışmadan önce chmod 700 /tmp/restore_lin.py diyerek yetki vermeliyiz. Restore parameter dizilimi ise python /tmp/restore_lin.py -f tmp/vcsa_postgres_VCDB_12022020.bak şeklinde olmalı.

 

selamlar,

 

Ümit GÖRÜR

Profesyonel Hizmetler | Professional Services

 

Yıldız Teknik Üniversitesi Davutpaşa Kampüsü Teknoloji Geliştirme Bölgesi Çiftehavuzlar Mahallesi Eski Londra Asfaltı Caddesi No: 151/1E D2 Blok

Ofis No: 1B-10 Esenler - İstanbul, TÜRKİYE

T: +90 (212) 393 00 90 | F: +90 (212) 393 00 91

www.aktekbilisim.com


 

 


Read more...