пятница, 27 января 2017 г.

Проверка настроек отображения даты

Столкнулся с такой ситуацией, что в базу в поле DATE записывали дату со временем, а когда вычитывали ее, то получали только дату, без времени. Проблема оказалась на стороне клиента. Для того чтобы проверить настройки вывода даты, нужно выполнить следующий запрос:

SELECT *
   FROM nls_session_parameters
 WHERE parameter like '%DATE%';

Чтобы установить формат отображения даты вместе с временем, нужно выполнить:

ALTER SESSION SET nls_date_format='dd.mm.yyyy hh24:mi:ss';

Поиск блокирующих сессий

Для отображения сессий, которые блокируют другие, нужно выполнить запрос:

select a.username
     , a.program
     , a.sid
     , a.serial#
  from v$session a
  join dba_blockers b
    on a.sid = b.holding_session
/

Аудит коннекшенов

Очень часто для пользователей используются профили, которые задают ограничение на количество ввода неправильного пароля, после чего пользователь блокируется. Поэтому очень важно определить, кто именно заблокировал пользователя, для этого используется следующий запрос:

SELECT CASE
         WHEN dasn.returncode=1017 THEN 'invalid password'
         ELSE 'the account is locked'
       END reason
     , dasn.*
  FROM DBA_AUDIT_SESSION dasn
 WHERE dasn.username='GUBITST'
   AND dasn.returncode IN (1017, 28000)
 ORDER BY dasn.timestamp DESC;

воскресенье, 28 августа 2016 г.

Настройка SSH на Linux

Для проверки, запущен у вас сервер SSH, нужно выполнить:

service sshd status

Если сервер запущен, то появится сообщение:

openssh-daemon (pid 3874) is running

Если серкер не установлен, то это можно сделать с помощью команды:

yum install openssh-server

Для подключения из iOS нужно выполнить следующую командy:

ssh user_name@host_name

или если нам нужно указать специфический потр, то пишем:

ssh -p 22 user_name@host_name

Иногда, нужно узнать, какие же порты открыты. Для этого устанавливаем NMAP:

yum nmap instal

После установки, запускаем следующую команду

nmap -sT -O localhost
которая выводит список открытых портов и кем они используются.

суббота, 30 июля 2016 г.

Запись образа Федоры на флешку

Я столкнулся с проблемой необходимости записи загрузочного образа Федоры на флешку.
Для этого я использовал следующее:

Сначала определил куда примонтирована флешка, с помощью команды:

fdisk -l

Это оказалось /dev/sdс, после этого, ввел следующую команду для записи образа:

dd if=Fedora_24.iso of=/dev/sdс bs=8M

где

Fedora_24.iso - имя образа в текущей папке

/dev/sdс - точка монтирования флешки.


четверг, 7 июля 2016 г.

Логирование работы программы

Следующий скрипт создает пакет и таблицы для записи логов.

Логи пишутся в двух режимах:
1. логи которые откатываются при откате транзакции
2. логи которые коммитятся в автономной транзакции и которые невозможно откатить.

DROP SEQUENCE seq_tbl_system_log
/
DROP SEQUENCE seq_tbl_log
/
DROP TABLE tbl_log
/
DROP TABLE tbl_system_log
/

CREATE SEQUENCE seq_tbl_system_log
/
CREATE TABLE tbl_system_log(
  id                 INTEGER CONSTRAINT pk_tbl_system_log PRIMARY KEY,
  name               VARCHAR2(30) NOT NULL CONSTRAINT un_tbl_system_log UNIQUE
)
/

CREATE SEQUENCE seq_tbl_log
/
CREATE TABLE tbl_log(
  id                 INTEGER CONSTRAINT pk_tbl_log PRIMARY KEY,
  system_log_id      INTEGER        NOT NULL,
  message            VARCHAR2(4000) NOT NULL,
  log_type_id        INTEGER        NOT NULL,
  ts                 TIMESTAMP DEFAULT SYSDATE NOT NULL,
  CONSTRAINT fk_tbl_log_tbl_system_log FOREIGN KEY (system_log_id) REFERENCES tbl_system_log (id)
)
/

CREATE OR REPLACE FORCE VIEW v_log
AS
SELECT tllg.id
     , tslg.name
     , tllg.message
     , DECODE(tllg.log_type_id, 1, 'INFO', 2, 'WARNING', 3, 'ERROR') log_type
     , tllg.ts
  FROM tbl_log tllg
       JOIN
       tbl_system_log tslg
         ON tllg.system_log_id = tslg.id
/
CREATE OR REPLACE PACKAGE pkg_log IS

PROCEDURE reg_system_log
  (p_name               IN VARCHAR2);

FUNCTION get_system_log_id
  (p_name               IN VARCHAR2)
 RETURN NUMBER;

PROCEDURE ins_log_info
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2);

PROCEDURE ins_log_info_autonomous
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2);

PROCEDURE ins_log_warning
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2);

PROCEDURE ins_log_warning_autonomous
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2);

PROCEDURE ins_log_error
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2);

PROCEDURE ins_log_error_autonomous
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2);

PROCEDURE del_log
  (p_id                 IN NUMBER);
PROCEDURE del_log_autonomous
  (p_id                 IN NUMBER);

END pkg_log;
/

CREATE OR REPLACE PACKAGE BODY pkg_log
IS
PROCEDURE reg_system_log
  (p_name               IN VARCHAR2)
IS
BEGIN
  INSERT INTO tbl_system_log
    (id,
     name)
  VALUES(
   seq_tbl_system_log.NEXTVAL,
   p_name);
END;

FUNCTION get_system_log_id
  (p_name               IN VARCHAR2)
 RETURN NUMBER
IS
  l_id NUMBER;
BEGIN
  SELECT id
    INTO l_id
    FROM tbl_system_log
   WHERE name = p_name;

  RETURN l_id;
END;

PROCEDURE ins_log
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2,
   p_log_type_id        IN NUMBER)
IS
BEGIN
  INSERT INTO tbl_log
    (id,
     system_log_id,
     message,
     log_type_id)
  VALUES(
     seq_tbl_log.NEXTVAL,
     p_system_log_id,
     p_message,
     p_log_type_id);
END;

--- INFO -----------------------------------
PROCEDURE ins_log_info
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2)
IS
BEGIN
  ins_log(p_system_log_id, p_message, 1);
END;

PROCEDURE ins_log_info_autonomous
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2)
IS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  ins_log(p_system_log_id, p_message, 1);
  COMMIT;
END;

--- WARNING -------------------------------
PROCEDURE ins_log_warning
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2)
IS
BEGIN
  ins_log(p_system_log_id, p_message, 2);
END;

PROCEDURE ins_log_warning_autonomous
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2)
IS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  ins_log(p_system_log_id, p_message, 2);
  COMMIT;
END;

--- ERROR ---------------------------------
PROCEDURE ins_log_error
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2)
IS
BEGIN
  ins_log(p_system_log_id, p_message, 3);
END;

PROCEDURE ins_log_error_autonomous
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2)
IS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  ins_log(p_system_log_id, p_message, 3);
  COMMIT;
END;

--- DELETE -----------------------------
PROCEDURE del_log
  (p_id                 IN NUMBER)
IS
BEGIN

  DELETE FROM tbl_log
    WHERE id = p_id;

END;

PROCEDURE del_log_autonomous
  (p_id                 IN NUMBER)
IS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN

  del_log(p_id);
  COMMIT;

END;

END pkg_log;
/

Определение размера таблиц

Для определения размера таблиц, я использую следующий SQL

SELECT table_name
     , TRUNC(SUM(table_size)/1024/1024)      AS table_size_meg
     , TRUNC(SUM(index_size)/1024/1024)      AS index_size_meg
     , TRUNC(SUM(lobsegment_size)/1024/1024) AS lobsegment_size_meg
     , TRUNC(SUM(lobindex_size)/1024/1024)   AS lobindex_size_meg
     , TRUNC(SUM(table_size      +
                 index_size      +
                 lobsegment_size +
                 lobindex_size)/1024/1024)   AS sum_meg
  FROM (SELECT segment_name AS table_name
             , bytes as table_size
             , 0     as index_size
             , 0     as lobsegment_size
             , 0     as lobindex_size
          FROM user_segments
         WHERE segment_type = 'TABLE'
         UNION ALL
        SELECT i.table_name
             , 0       as table_size
             , s.bytes as index_size
             , 0       as lobsegment_size
             , 0       as lobindex_size
          FROM user_indexes i
             , user_segments s
         WHERE s.segment_name = i.index_name
           AND s.segment_type = 'INDEX'
         UNION ALL
        SELECT l.table_name
             , 0       as table_size
             , 0       as index_size
             , s.bytes as lobsegment_size
             , 0       as lobindex_size
          FROM user_lobs l
             , user_segments s
         WHERE s.segment_name = l.segment_name
           AND s.segment_type = 'LOBSEGMENT'
         UNION ALL
        SELECT l.table_name
             , 0       as table_size
             , 0       as index_size
             , 0       as lobsegment_size
             , s.bytes as lobindex_size
          FROM user_lobs l
             , user_segments s
         WHERE s.segment_name = l.index_name
           AND s.segment_type = 'LOBINDEX')
 GROUP BY table_name
 ORDER BY sum_meg DESC

файл table_size.sql