Office Address

  • 123/A, Miranda City Prikano
  • +0989 7876 9865 9
  • info@example.com

Social List

¡Descubre el secreto de Oracle para recuperar datos en segundos sin copias de seguridad!

Lectura: 4 minutos

El Flashback en Oracle es una tecnología que permite a los usuarios acceder y recuperar datos históricos sin necesidad de restaurar copias de seguridad completas ni interrumpir el funcionamiento de la base de datos. Es una herramienta poderosa que facilita la recuperación de datos en escenarios como errores humanos, consultas incorrectas o eliminación accidental de datos.

Características principales del Flashback

  1. Recuperación rápida: Permite restaurar datos a un estado anterior sin requerir restauraciones complejas.
  2. Diagnóstico: Facilita la identificación de cambios realizados en los datos a lo largo del tiempo.
  3. Flexibilidad: Proporciona diferentes niveles de granularidad, desde filas individuales hasta toda la base de datos.

Habilitar Flashback en una tabla

Creamos la tabla employees, y la llenamos con datos para poder borrar la información y recuperar los datos con flashback.

 
create table departments (
    id          number generated by default on null as identity
                constraint departments_id_pk primary key,
    name        varchar2(255 char) not null,
    location    varchar2(4000 char),
    country     varchar2(4000 char)
);


create table employees (
    id               number generated by default on null as identity
                     constraint employees_id_pk primary key,
    department_id    number
                     constraint employees_department_id_fk
                     references departments,
    name             varchar2(50 char) not null,
    email            varchar2(255 char),
    cost_center      number,
    date_hired       date,
    job              varchar2(255 char)
);

-- table index
create index employees_i1 on employees (department_id);

-- triggers
create or replace trigger employees_biu
    before insert or update
    on employees
    for each row
begin
    :new.email := lower(:new.email);
end employees_biu;
/


-- create views
create or replace view emp_v as
select
    departments.id           department_id,
    departments.name         department_name,
    departments.location     location,
    departments.country      country,
    employees.id             employee_id,
    employees.name           employee_name,
    employees.email          email,
    employees.cost_center    cost_center,
    employees.date_hired     date_hired,
    employees.job            job
from
    departments,
    employees
where
    employees.department_id(+) = departments.id
/

-- load data

insert into departments (
    id,
    name,
    location,
    country
) values (
    1,
    'Sales',
    'Katipa',
    'VN'
);
insert into departments (
    id,
    name,
    location,
    country
) values (
    2,
    'Sales',
    'Tuvbefto',
    'MA'
);
insert into departments (
    id,
    name,
    location,
    country
) values (
    3,
    'Sales',
    'Kecoki',
    'HT'
);
insert into departments (
    id,
    name,
    location,
    country
) values (
    4,
    'Sales',
    'Jitobi',
    'MF'
);

commit;

alter table departments
modify id generated always  as identity restart start with 5;

insert into employees (
    id,
    department_id,
    name,
    email,
    cost_center,
    date_hired,
    job
) values (
    1,
    3,
    'Bruce Curtis',
    'ubu@cofbocuw.om',
    37,
    sysdate-45,
    'Architect'
);
insert into employees (
    id,
    department_id,
    name,
    email,
    cost_center,
    date_hired,
    job
) values (
    2,
    3,
    'Joe Butler',
    'dano@apluhji.sa',
    92,
    sysdate-12,
    'Analyst'
);
insert into employees (
    id,
    department_id,
    name,
    email,
    cost_center,
    date_hired,
    job
) values (
    3,
    3,
    'Herbert French',
    'kicco@kih.ga',
    94,
    sysdate-31,
    'Analyst'
);
insert into employees (
    id,
    department_id,
    name,
    email,
    cost_center,
    date_hired,
    job
) values (
    4,
    4,
    'Lola Rose',
    'avepuzog@toduriko.kh',
    72,
    sysdate-68,
    'Consultant'
);
insert into employees (
    id,
    department_id,
    name,
    email,
    cost_center,
    date_hired,
    job
) values (
    5,
    2,
    'Fannie Ballard',
    'bizeg@ulzan.gm',
    24,
    sysdate-29,
    'Manager'
);
insert into employees (
    id,
    department_id,
    name,
    email,
    cost_center,
    date_hired,
    job
) values (
    6,
    3,
    'Josephine Barker',
    'cuwaho@ulke.mh',
    72,
    sysdate-99,
    'Manager'
);
insert into employees (
    id,
    department_id,
    name,
    email,
    cost_center,
    date_hired,
    job
) values (
    7,
    3,
    'Maud Austin',
    'bibhaed@umipehki.af',
    44,
    sysdate-14,
    'Engineer'
);
insert into employees (
    id,
    department_id,
    name,
    email,
    cost_center,
    date_hired,
    job
) values (
    8,
    3,
    'Lydia Harris',
    'pe@ipjute.edu',
    77,
    sysdate-1,
    'Specialist'
);
insert into employees (
    id,
    department_id,
    name,
    email,
    cost_center,
    date_hired,
    job
) values (
    9,
    3,
    'Genevieve Copeland',
    'wof@zapol.yt',
    97,
    sysdate-81,
    'Manager'
);
insert into employees (
    id,
    department_id,
    name,
    email,
    cost_center,
    date_hired,
    job
) values (
    10,
    1,
    'Cory Sanchez',
    'piwuh@pa.bf',
    73,
    sysdate-61,
    'Analyst'
);
insert into employees (
    id,
    department_id,
    name,
    email,
    cost_center,
    date_hired,
    job
) values (
    11,
    4,
    'Della Evans',
    'ugapew@jevpov.mm',
    55,
    sysdate-45,
    'Engineer'
);
insert into employees (
    id,
    department_id,
    name,
    email,
    cost_center,
    date_hired,
    job
) values (
    12,
    2,
    'Janie Tucker',
    'bowvuh@mulus.za',
    20,
    sysdate-63,
    'Engineer'
);
insert into employees (
    id,
    department_id,
    name,
    email,
    cost_center,
    date_hired,
    job
) values (
    13,
    4,
    'Jayden Stevens',
    'daulo@piravub.mc',
    5,
    sysdate-86,
    'Engineer'
);
insert into employees (
    id,
    department_id,
    name,
    email,
    cost_center,
    date_hired,
    job
) values (
    14,
    3,
    'Brian Griffith',
    'ego@te.us',
    5,
    sysdate-43,
    'Salesman'
);

commit;

Darle permisos de FLASHBACK a nuestro usuario

GRANT FLASHBACK ANY TABLE TO "BLOGAPRENDIZ" ;

Ejecuto una consulta para saber el timestamp antes de borrar

Habilitamos y borramos el registro

Utilizamos ROW MOVEMENT para habilitar la recuperación de registros, eliminamos un registro y lo recuperamos con FLASHBACK TIMESTAMP

ALTER TABLE employees ENABLE ROW MOVEMENT;

delete from employees where id in (1,2);

commit;

Verificamos que se recuperan los datos

FLASHBACK TABLE employees TO 
TIMESTAMP TO_TIMESTAMP('2025-01-18 21:15:00', 'YYYY-MM-DD HH24:MI:SS');

Recuperamos

Query para revisar si los datos se encuentran ahí

Conclusión: Aprovechando el Poder de Oracle Flashback

En resumen, Oracle Flashback es una herramienta increíblemente poderosa que permite recuperar datos históricos de manera eficiente, solucionar errores humanos y diagnosticar problemas sin interrumpir las operaciones de la base de datos. Su flexibilidad para trabajar a diferentes niveles, desde tablas individuales hasta toda la base de datos, lo convierte en un recurso esencial para administradores y desarrolladores que buscan mantener la integridad y continuidad de sus sistemas.

Al habilitar y configurar adecuadamente Flashback en tus entornos, no solo puedes reducir el tiempo de inactividad, sino también mejorar la capacidad de respuesta ante situaciones imprevistas. Ya sea restaurando registros eliminados, deshaciendo transacciones o retrocediendo en el tiempo a nivel de tabla o base de datos, Flashback te brinda la tranquilidad de saber que puedes deshacer errores de manera sencilla.

¿Ya has implementado Flashback en tus sistemas? Comparte tu experiencia o cualquier duda en los comentarios, ¡estaré encantado de ayudarte! 🚀

Post a Comment

Your email address will not be published. Required fields are marked *