Adicionando target da OCI manualmente usando SSH Private Key no Enterprise Manager Cloud Control 13c

Pessoal a dica de hoje é sobre como adicionar um target da OCI manualmente no Enterprise Manager Cloud Control 13c usando private key ssh.

Esta semana estive implementando o Enterprise Manager Cloud Control 13c usando maquinas na Oracle Cloud Infrastructure (OCI), como o acesso ao servidor de banco Oracle 11g era feito apenas usando chave privada, tive a necessidade de adicionar este servidor para ser monitorado no Cloud Control 13c usando chave privada ssh, pesquisei muito e quebrei a cabeça para adicionar um host do OCI, desta forma resolvi postar para ajudar outras pessoas, abaixo seguem os passos:

Adicionando manualmente o servidor do Oracle database para ser monitorado no Enterprise Manager Cloud Control 13c:

Adicionando o host do Oracle 11g plataforma linux:

Criar o diretório no oracle home com usuário oracle para instalação do Agent no servidor que iremos monitorar Oracle database 11g.

mkdir -p /u02/app/oracle/product/11.2.0/agentem13c

Adicionar o diretório base do agent para deploy no Enterprise Manager Cloud Control 13c:

Descobrindo a chave privada para ser adicionada do usuário default opc na OCI para adicionar no Enterprise Manager Cloud Control 13c.

cat /home/opc/.ssh/id_rsa

Basta copiar todo o texto com a chave privada e colar na próxima tela:

Pronto, basta dar ok e seguir os próximos passos que o deploy no target com Oracle database 11g ira finalizar e ser adicionado com sucesso no Enterprise Manager Cloud Control 13c.

Controlando chamadas do RSYNC

A dica de hoje, é sobre como controlar a chamadas do rsync, muitas vezes temos rotinas que executam o rscyn diversas vezes no dia, dessa forma temos que evitar que uma nova chamada do rsync so seja efetuada se a anterior ja estiver finalizada.

processo=$(ps -ef | grep “rsync” | grep -v grep | wc -l)

if [ ${processo} -gt 3 ]; then
echo $(date “+%Y-%m-%d %H:%M:%S”) ” – executando rsync.” >> /usr/backup/logs/log_rsync.log
echo $(date “+%Y-%m-%d %H:%M:%S”) ” – executando rsync.”
else
rsync -e ssh -Pazv oracle@10.10.0.1:/u02/backup/archivelog/ /u01/backup/archivelog/ –recursive
fi

Extend lvm disks

Dica de hoje é como expandir meus discos lvm, segue abaixo como realizar o procedimento.

1- Tamanho atual do volume logico do lvm vol_oradata 5gb, iremos expandir para 10gb.

lvs -o lv_name,lv_path,vg_name,lv_size

2- Verificando tamanho real do disco fisico.

fdisk -l

3- Configurando o novo tamanho do disco para 10gb.

pvresize –setphysicalvolumesize 10g /dev/sdc

lvextend -l +100%FREE -r /dev/vgoradata/vol_oradata

4- Tamanho real do volume logico apos a expansão.

Usando discos com LVM

A dica de hoje é como usar discos com lvm, seguem abaixo passos de como configurar um novo disco com lvm.

1 – Iremos usar o novo disco Disk /dev/sdc: 5368 MB.

2 – Criando volume fisico.

pvcreate /dev/sdc

3 – Listando volume fisico.

pvs

4 – Criar o grupo do lvm oradata.

vgcreate vgoradata /dev/sdc

vgdisplay vgoradata

5 – Criar volume logico.

lvcreate -n vol_oradata -l 100%FREE vgoradata

lvdisplay

6 – Formatando volume ext3.

mkfs.ext3 /dev/vgoradata/vol_oradata

7 – Verificando id do disco para configurar o fstab.

blkid /dev/vgoradata/vol_oradata

8 – Criar diretorio para montar o disco.

mkdir -p oradata

8 – Configurar o fstab.

9 – Montar disco no diretorio oradata.

mount -a

Cross-Database Queries in Azure SQL Database

Estive migrando alguns bancos on premise para o Azure sql elastic pool, em algumas consultas verifiquei que elas faziam inner join em outros bancos, sabemos que de forma nativa os bancos do Azure SQL são isolados e não suportam o cross-database, desta forma apenas usando o Azure sql elastic pool podemos ter uma opção para fazer nossos selects entre bancos, abaixo seguem informações:

  • Tela de erro caso tentem ler alguma tabela de outro banco dentro do elastic pool, neste exemplo estou fazendo um select no banco destino.dbo.tb_aluno.

Desta forma segue uma solução que pode resolver este problema, usando external tables:

1 - Criar login no master.
CREATE LOGIN usr_crossdb WITH PASSWORD='P@ssw0rd';

2 - Devemos criar o usuario que tera acesso a leitura nos dois bancos, origem e destino.
CREATE USER usr_crossdb FOR LOGIN usr_crossdb;

3 - Permissão de leitura nos dois bancos, origem e destino.
EXEC sp_addrolemember 'db_datareader', 'usr_crossdb'

4 - Criar MASTER KEY no servidor de destino.
CREATE MASTER KEY ENCRYPTION BY PASSWORD='P@ssw0rd';

5 - Criar a credencial no servidor de destino
CREATE DATABASE SCOPED CREDENTIAL usr_crossdb -- credential name
WITH IDENTITY = 'usr_crossdb', -- login or contained user name
SECRET = 'P@ssw0rd';-- login or contained user password

6 - Criar o data source de acesso ao banco onde queremos fazer a leitura dos dados.
CREATE EXTERNAL DATA SOURCE ACESSO_REMOTODB
WITH
(
TYPE=RDBMS, -- data source type
LOCATION='srvhmldb.database.windows.net', -- Azure SQL Database server name
DATABASE_NAME='origem', -- database name
CREDENTIAL=usr_crossdb -- credential used to connect to server / database
);

6 - Verificar a ddl da tabela que iremos fazer a leitura, copiar a ddl e adaptar para que seja criado uma external table com os campos e tipo de dados da tabela de origem.

create table tb_aluno (matricula bigint identity(1,1),nome varchar(300) not null)

8 - Criar um esquema para diferenciar com o nome do banco de origem para facil entendimento.
CREATE SCHEMA DB_ORIGEM;

9 - Criar external table apontando para o data source criado usando a ddl da tabela de origem sem identity.

CREATE EXTERNAL TABLE [DB_ORIGEM].[tb_aluno]
(
matricula bigint,
nome varchar(300) not null
)
WITH (DATA_SOURCE = [ACESSO_REMOTODB], -- data source
SCHEMA_NAME = 'dbo', -- external table schema
OBJECT_NAME = 'tb_aluno' -- name of table in external database
);
GO
10 - Select entre os bancos.

select al.matricula,
al.nome,
h.nt1,
h.nt2,
h.nt3
from [DB_ORIGEM].[tb_aluno] al
inner join tb_historico_2008 h
on al.matricula = h.matricula
  • Select entre os bancos origem e destino
  • Bancos usados

https://azure.microsoft.com/pt-br/blog/querying-remote-databases-in-azure-sql-db/

DBlink Oracle to SQL Server

Pessoal estava com a necessidade de consumir algumas informações do SQL Server em um banco Oracle, desta forma fiz um procedimento simples para quem precisar.

Instalando os pacotes necessários.
yum install unixODBC unixODBC-devel freetds -y

TNSNAMES
MSSQL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST=lab11g.localdomain)(PORT=1524))
(CONNECT_DATA=(SID=MSSQL))
(HS=OK)
)

LISTENER
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = lab11g.localdomain)(PORT = 1521))
)
)

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ora11g)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0.4/db_1)
(SID_NAME = ora11g)
)
(SID_DESC=
(SID_NAME=MSSQL) # ALIAS USADO EM TODA A CONFIGURACAO
(ORACLE_HOME=/u01/app/oracle/product/11.2.0.4/db_1)
(PROGRAM=dg4odbc)
)

)

ADR_BASE_LISTENER = /u01/app/oracle

lsnrctl stop
lsnrctl start

Testando a instalação do ODBC
[root@lab11g ~]# odbcinst -j
unixODBC 2.3.1
DRIVERS…………: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size…….: 8
SQLLEN Size……..: 8
SQLSETPOSIROW Size.: 8

Criando o init no Oracle
vi $ORACLE_HOME/hs/admin/initMSSQL.ora

HS_FDS_CONNECT_INFO = MSSQL
HS_FDS_TRACE_LEVEL = OFF
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so # LIB
set ODBCINI=/etc/odbc.ini #LOCAL DO ARQUIVO ODBC DE CONFIGURACAO

Criando o arquivo do odbc com as configurações
vi /etc/odbc.ini

[ODBC Data Sources]
MSSQL = MSSQL Server

[MSSQL]
# Reference driver from the “/etc/odbcinst.ini” file.
# Driver = FreeTDS
# Or use a direct driver reference, rather than reference
# one in the “/etc/odbcinst.ini” file.
Driver=/usr/lib64/libtdsodbc.so.0
Description = MSSQL Server
Trace = No
Server = 192.168.0.31
Database = LAB
Port = 1433
TDS_Version = 7.2

[Default]
Driver = /usr/lib64/libtdsodbc.so.0

Testando o acesso ao banco no SQL Server
[root@lab11g ~]# osql -S MSSQL -U teste -P teste

checking shared odbc libraries linked to isql for default directories…
strings: ”: No such file
trying /tmp/sql … no
trying /tmp/sql … no
trying /etc … OK
checking odbc.ini files
reading /root/.odbc.ini
[MSSQL] found in /root/.odbc.ini
found this section:
[MSSQL]
# Reference driver from the “/etc/odbcinst.ini” file.
# Driver = FreeTDS
# Or use a direct driver reference, rather than reference
# one in the “/etc/odbcinst.ini” file.
Driver=/usr/lib64/libtdsodbc.so.0
Description = MSSQL Server
Trace = No
Server = 192.168.44.33
Database = CENTER_MIDIA
Port = 1433
TDS_Version = 7.2
#QuotedId=YES
#AnsiNPW=YES
#VarMaxAsLong=YES

looking for driver for DSN [MSSQL] in /root/.odbc.ini
found driver line: ” Driver=/usr/lib64/libtdsodbc.so.0″
driver “/usr/lib64/libtdsodbc.so.0” found for [MSSQL] in .odbc.ini
found driver named “/usr/lib64/libtdsodbc.so.0”
/usr/lib64/libtdsodbc.so.0 is an executable file
“Server” found, not using freetds.conf
Server is “192.168.44.33”
looking up hostname for ip address 192.168.44.33
osql: warning: no DNS hostname found for “192.168.44.33”

Configuration looks OK. Connection details:

DSN: MSSQL
odbc.ini: /root/.odbc.ini
Driver: /usr/lib64/libtdsodbc.so.0
Server hostname: 192.168.44.33
Address: 192.168.44.33

Attempting connection as teste …
+ isql MSSQL teste teste -v
+—————————————+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+—————————————+
SQL>quit

Outro teste de acesso ao SQL Server
[root@lab11g ~]# isql MSSQL teste ‘teste’ -v
+—————————————+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+—————————————+
SQL>quit

 

Crie o usuário com acesso no SQL Server e suas permissões, o meu foi o teste.
Criando o dblink no Oracle
create public database link MSSQL connect to “teste” identified by “teste” using ‘MSSQL’;

Acessando a tabela do SQL Server pelo Oracle.
SQL> DESC TB_BAIRRO@MSSQL;
Name Null? Type
—————————————– ——– —————————-
bairro_codigo NUMBER(10)
cidade_codigo NVARCHAR2(50)
bairro_descricao NVARCHAR2(50)

SQL>

Limpeza de objetos

Pessoal criei esse script no intuito de agilizar o processo de limpeza de objetos no Oracle, segue abaixo script:

SET SERVEROUTPUT ON
DECLARE V_ESQUEMA VARCHAR2(30) := 'PROTHEUS';
BEGIN
  FOR APAGAR IN (  
					SELECT 'DROP TABLE '||'"'||OWNER||'"'||'.'||'"'||OBJECT_NAME||'"'|| ' CASCADE CONSTRAINTS PURGE' DDL FROM DBA_OBJECTS WHERE OWNER = V_ESQUEMA AND OBJECT_TYPE='TABLE'
					UNION ALL
					SELECT 'DROP SEQUENCE '||'"'||OWNER||'"'||'.'||'"'||OBJECT_NAME||'"' DDL FROM DBA_OBJECTS WHERE OWNER = V_ESQUEMA AND OBJECT_TYPE='SEQUENCE'
					UNION ALL
					SELECT 'DROP VIEW '||'"'||OWNER||'"'||'.'||OBJECT_NAME DDL FROM DBA_OBJECTS WHERE OWNER = V_ESQUEMA AND OBJECT_TYPE='VIEW'
					UNION ALL
					SELECT 'DROP PROCEDURE '||'"'||OWNER||'"'||'.'||OBJECT_NAME DDL FROM DBA_OBJECTS WHERE OWNER = V_ESQUEMA AND OBJECT_TYPE='PROCEDURE'
					UNION ALL
					SELECT 'DROP FUNCTION '||'"'||OWNER||'"'||'.'||OBJECT_NAME DDL FROM DBA_OBJECTS WHERE OWNER = V_ESQUEMA AND OBJECT_TYPE='FUNCTION'
					UNION ALL
					SELECT 'DROP INDEX '||'"'||OWNER||'"'||'.'||'"'||INDEX_NAME||'"'|| ';' DDL FROM DBA_INDEXES WHERE OWNER = V_ESQUEMA
			    ) 
  LOOP
	 DBMS_OUTPUT.PUT_LINE(APAGAR.DDL||' EXECUTADO.');
     EXECUTE IMMEDIATE APAGAR.DDL;
  END LOOP;
-- MATAR SESSOES E LIMPAR O RESTO
	BEGIN
		 FOR SESSIONS IN ( 
							SELECT SID, SERIAL# 
							FROM   V$SESSION 
							WHERE  USERNAME = V_ESQUEMA
						)
		  LOOP
			 DBMS_OUTPUT.PUT_LINE('KILL SESSOES: '||V_ESQUEMA);
			 EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION '''||SESSIONS.SID||','||SESSIONS.SERIAL#||'''';
			 EXECUTE IMMEDIATE 'DROP USER '||V_ESQUEMA||' CASCADE';
		  END LOOP;
	END;
-- DROP DO ESQUEMA
	DBMS_OUTPUT.PUT_LINE('DROP USER '||V_ESQUEMA||' CASCADE');
	EXECUTE IMMEDIATE 'DROP USER '||V_ESQUEMA||' CASCADE';
END;

Log muito grande do Listener Windows

Pessoal hoje tive um problema no ambiente de um cliente, o log do listener chegou em 4gb e começou a gerar problemas, dessa forma fiz um script para automatizar e evitar esses problemas bastando apenas ser colocado no agendador do windows.

Basta mudar o diretorio onde são gerados os logs do seu ambiente, e criar um arquivo.bat

set d=%date:~-4,4%%date:~-7,2%%date:~0,2%
set d=%d: =_%
set t=%time:~0,2%%time:~3,2%%time:~6,2%
set t=%t: =0%
D:
cd \app\Administrator\diag\tnslsnr\srv03\listener3\trace
lsnrctl set log_status off
RENAME listener.log "listener_%d%_%t%.log"
lsnrctl set log_status on

Criando bancos DEV/HML com Duplicate

https://sgbdbrasil.wordpress.com/2018/10/31/criando-bases-de-hml-e-dev/

A dica de hoje é para quem precisar sempre criar ou atualizar um ambiente Oracle de desenvolvimento ou homologação de forma fácil utilizando o duplicate.

1- Criar um init baseado nas configurações do teu ambiente, podem adaptar este init base DEV abaixo e utilizar:

*.audit_trail='DB'
*.commit_logging='BATCH'
*.commit_wait='NOWAIT'
*.compatible='11.2.0.4.0'
*.control_files='/u02/dev/oradata/dev/control01.ctl','/u02/dev/oradata/dev/control02.ctl','/u02/dev/oradata/dev/control03.ctl'#Restore Controlfile
*.core_dump_dest='/u01/app/oracle/admin/dev/cdump'
*.cursor_sharing='EXACT'
*.db_block_size=8192
*.db_domain=”
*.db_file_multiblock_read_count=16
*.db_name='dev'
*.db_writer_processes=2
*.diagnostic_dest='/u01/app/oracle'
*.enable_goldengate_replication=TRUE
*.job_queue_processes=20
*.large_pool_size=0
*.log_archive_dest_1='LOCATION=/u02/dev/backup/archivelog/'
*.log_archive_format='%t_%s_%r.arc'
*.memory_max_target=9663676416
*.memory_target=9663676416
*.open_cursors=6000
*.optimizer_index_caching=70
*.optimizer_index_cost_adj=1
*.optimizer_mode='ALL_ROWS'
*.pga_aggregate_target=0
*.processes=2000
*.recyclebin='OFF'
*.remote_login_passwordfile='EXCLUSIVE'
*.session_cached_cursors=40
*.sessions=1105
*.sga_max_size=0
*.sga_target=0
*.undo_management='AUTO'
*.undo_retention=3600
*.undo_tablespace='UNDOTBS1'
*.utl_file_dir='*'
*.db_file_name_convert='/oradata/DADOS/prd/','/u02/dev/oradata/dev/','/oradata/INDICES/prd/','/u02/dev/oradata/dev/','/oradata/INDICES/datafile','/u02/dev/oradata/dev/'
*.log_file_name_convert='/oradata/DADOS/REDOLOG/prd/','/u02/dev/oradata/dev/','/oradata/INDICES/REDOLOG/prd/','/u02/dev/oradata/dev/'

2 – Ajustar o script do duplicate abaixo:

export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0.4/db_1
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_SID=dev
export BASE=/u01/app/oracle
export DEST=/u02/dev/backup/
export HOJE=`date +%Y%m%d`
export SPOOL=$DEST/logs

export ORACLE_SID=dev
sqlplus / as sysdba << EOF
spool $SPOOL/atualiza_dev_0_shutdown_base_$HOJE.spool
SHUTDOWN ABORT;

# INICIANDO A INSTANCIA DO BANCO UTILIZANDO O PFILE QUE CRIAMOS ACIMA
STARTUP NOMOUNT pfile='/u02/dev/backup/scripts/initdev.ora';
spool off
exit
EOF

# CLONE DO BACKUP PARA HML
rman auxiliary / msglog $SPOOL/clonando_base_$HOJE.spool << EOF
RUN
{

#DATA E HORARIO FINAL DO PONTO DO RESTORE A SER EFETUADO
set until time “to_date('18/10/2018 23:00:00','DD/MM/YYYY HH24:MI:SS')”;
allocate auxiliary channel c1 type disk ;

# LOCAL ONDE ESTA O BACKUP DOS CONTROLFILES E DO BACKUPSET
duplicate target database to hml backup location='/u02/dev/backup/restore' nofilenamecheck;
}
EOF

 

# LEMBRAR DE RECRIAR A TEMP

sqlplus / as sysdba << EOF
spool $SPOOL/create_spfile_hml_$HOJE.spool
CREATE TEMPORARY TABLESPACE TEMP1 TEMPFILE ‘/u02/dev/oradata/dev/temp_01.dbf' SIZE 20M autoextend on next 100M maxsize 31G;
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP1;
DROP TABLESPACE TEMP2 INCLUDING CONTENTS AND DATAFILES;
SHUTDOWN ABORT;
STARTUP pfile='/u02/dev/backup/scripts/initdev.ora';
CREATE SPFILE FROM pfile='/u02/dev/backup/scripts/initdev.ora';
SHUTDOWN ABORT;
STARTUP
spool off
exit
EOF

Teste de integridade dos Backups

Fala pessoal, hoje a dica é sobre como automatizar os testes de integridade nos backups diários.
Na rotina abaixo testo a integridade dos backups maiores que D-1.
Referência: https://msdn.microsoft.com/pt-br/library/ms188902.aspx

DECLARE @SQL VARCHAR(MAX)
DECLARE @BKP sysname
DECLARE curDB CURSOR FORWARD_ONLY STATIC FOR
SELECT
bmf.physical_device_name
FROM msdb.dbo.backupmediafamily bmf
INNER JOIN msdb.dbo.backupset bs ON bmf.media_set_id = bs.media_set_id
WHERE (CONVERT(datetime, bs.backup_start_date, 102) >= GETDATE() – 1)
AND bs.type LIKE ‘D’
ORDER BY
bs.database_name,bs.backup_finish_date
OPEN curDB
FETCH NEXT FROM curDB INTO @BKP
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @SQL = ‘restore verifyonly from disk = ‘+””+ltrim(rtrim(@BKP))+””+’ WITH CHECKSUM;’
EXEC(@SQL)
— PRINT @SQL
FETCH NEXT FROM curDB INTO @BKP
END
CLOSE curDB
DEALLOCATE curDB