Gestión, copia de seguridad y recuperación de registros de bases de datos MySQL (¡detalles gráficos!)

Gestión, copia de seguridad y recuperación de registros de bases de datos MySQL

Directorio de artículos


Preparación: primero cree una base de datos y una tabla

mysql -u root -p

create database SCHOOL;
use SCHOOL;
create table class (id int(10) not null,name varchar(10) not null,cardid varchar(18),phone varchar(11),address varchar(50));

desc class;

insert into class values (1,'zhangsan','12','111111','nanjing');
insert into class values (4,'lisi','123','444444','suzhou');
insert into class values (2,'wangwu','1234','222222','beijing');
insert into class values (5,'zhaoliu','12345','555555','nanjing');
insert into class values (3,'qianqi','123456','333333','shanghai');

select * from class;

Inserte la descripción de la imagen aquí

Insertar datos y ver la estructura de la tabla

Inserte la descripción de la imagen aquí

Uno, gestión de registros de MySQL

La ubicación de almacenamiento predeterminada de los registros de MySQL es / usr / local / mysql / data

1.1 Clasificación de registros de MySQL

  1. Registro de errores
  2. Registro de consultas general
  3. Registro binario
  4. Registro de consultas lento

1.2 El registro de MySQL está activado

  • Reparando permanentemente el archivo de configuración de MySQL
vim /etc/my.cnf
[mysqld]
##错误日志,用来记录当MySQL启动、停止或运行时发生的错误信息,默认已开启
#指定错误日志的保存位置和文件名
log-error=/usr/local/mysql/data/mysql_error.log

##通用查询日志,用来记录MySQL的所有连接和语句,默认是关闭的
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log

##二进制日志(binlog),用来记录所有更新了数据或者已经潜在更新了数据的语句,记录了数据的更改,可用于数据恢复,默认已开启
log-bin=mysql-bin
#也可以 log_bin=mysql-bin

##慢查询日志,用来记录所有执行时间超过long_query_time秒的语句,可以找到哪些查询语句执行时间长,以便于优化,默认是关闭的
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5  #设置超过5秒执行的语句被记录,缺省时为10秒

systemctl restart mysqld.service 

Inserte la descripción de la imagen aquí

1.3 Ingrese a la base de datos para verificar si el registro correspondiente está habilitado

1) Verifique si el registro de consultas general está habilitado

mysql -u root -p
show variables like 'general%';

Inserte la descripción de la imagen aquí

2) Verifique si el registro binario está encendido

show variables like 'log_bin%';

Inserte la descripción de la imagen aquí

3) Ver funciones relacionadas del registro de consultas lentas

(1) Compruebe si la función de registro de consultas lentas está habilitada

show variables like '%slow%';

Inserte la descripción de la imagen aquí

(2) Ver la configuración del tiempo de consulta lento

show variables like 'long_query_time';

Inserte la descripción de la imagen aquí

(3) Establezca el método para iniciar una consulta lenta en la base de datos.

Se ha configurado antes y no se demostrará

set global slow_query_log=ON;

Inserte la descripción de la imagen aquí

Dos, copia de seguridad y recuperación completa de MySQL

2.1 La importancia de la copia de seguridad de los datos

  • El objetivo principal de la copia de seguridad es la recuperación ante desastres.
  • En un entorno de producción, la seguridad de los datos es de suma importancia
  • Cualquier pérdida de datos puede tener graves consecuencias.

2.2 Causas de la pérdida de datos

  • Error de programa
  • Error humano
  • Error de operación
  • Falla de disco
  • Desastres (como incendios, terremotos) y robos

2.3 Clasificación de la copia de seguridad de la base de datos

1) Clasificación desde la perspectiva de la física y la lógica

(1) Respaldo físico

  • Copia de seguridad de archivos físicos (como archivos de datos, archivos de registro, etc.) del sistema operativo de la base de datos
  • Métodos de respaldo físico
    • Copia de seguridad en frío (copia de seguridad fuera de línea): se realiza cuando la base de datos está cerrada
    • Copia de seguridad en caliente (copia de seguridad en línea): la base de datos se está ejecutando y depende del archivo de registro de la base de datos
    • Copia de seguridad en caliente: se realiza una copia de seguridad de la base de datos cuando la tabla está bloqueada (no se puede escribir, pero se puede leer)

(2) Copia de seguridad lógica

  • Copia de seguridad de los componentes lógicos de la base de datos (como objetos de la base de datos, como tablas)

2) Clasificación desde la perspectiva de la estrategia de respaldo de la base de datos

(1) Copia de seguridad completa

  • Haga una copia de seguridad completa de la base de datos cada vez

(2) Respaldo diferencial

  • Realice una copia de seguridad de los archivos que se han modificado desde la última copia de seguridad completa

(3) Copia de seguridad incremental

  • Solo se respaldarán los archivos modificados después de la última copia de seguridad completa o copia de seguridad incremental

2.4 Métodos de copia de seguridad habituales

1) modo de espera en frío físico

  • La base de datos se cierra durante la copia de seguridad y los archivos de la base de datos se empaquetan directamente
  • La velocidad de la copia de seguridad es rápida y la recuperación también es la más sencilla.

2) Herramienta de copia de seguridad dedicada mydump o mysqlhotcopy

  • Herramientas de copia de seguridad lógica de uso común para mysqldump
  • mysqlhotcopy solo tiene tablas de respaldo MyISAM y ARCHIVE

3) Habilite el registro binario para la copia de seguridad incremental

  • Para las copias de seguridad incrementales, el registro binario debe actualizarse

4) Copia de seguridad de herramientas de terceros

  • Software gratuito de copia de seguridad en caliente MySQL Percona XtraBackup

2.5 copia de seguridad completa de MySQL

1) Concepto

  • Es una copia de seguridad de toda la base de datos, la estructura de la base de datos y la estructura de archivos.
  • Lo que se guarda es la base de datos en el momento en que se completa la copia de seguridad.
  • Es la base de la copia de seguridad diferencial y la copia de seguridad incremental.

2) Ventajas y desventajas de la copia de seguridad completa

  • ventaja:

    Operación simple y conveniente de respaldo y recuperación

  • Desventajas:

    Hay mucha duplicación de datos.

    Ocupa mucho espacio de respaldo

    Tiempo prolongado de copia de seguridad y restauración

3) Clasificación de la copia de seguridad completa de la base de datos

(1) Respaldo y recuperación en frío físicos

  • Cerrar la base de datos MySQL
  • Utilice el comando tar para empaquetar directamente la carpeta de la base de datos
  • Simplemente reemplace el directorio MySQL existente

(2) copia de seguridad y recuperación de mysqldump

  • La propia herramienta de copia de seguridad de MySQL puede realizar fácilmente la copia de seguridad de MySQL
  • Puede exportar bibliotecas y tablas especificadas como scripts SQL
  • Utilice el comando mysql para importar los datos de la copia de seguridad

3. Comandos básicos para copia de seguridad y recuperación de bases de datos en frío y copia de seguridad y recuperación completas

3.1 Respaldo y recuperación físicos en frío

systemctl stop mysqld
yum -y install xz					#xz是一个压缩工具
#压缩备份
tar Jcvf /opt/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data/
#解压恢复
tar Jxvf /opt/mysql_all_2021-02-05.tar.xz -C /usr/local/mysql/data

systemctl start mysqld

3.2 copia de seguridad y recuperación de mysqldump

1) Copia de seguridad completa de una o más bibliotecas completas (incluidas todas las tablas)

#导出的备份文件就是数据库脚本文件
mysqldump -u root -p[密码] --databases 库名1 [库名2] … > /备份路径/备份文件名.sql
例:
mysqldump -u root -p --databases school > /opt/school.sql
mysqldump -u root -p --databases mysql school > /opt/mysql-school.sql

2) Copia de seguridad completa de todas las bibliotecas en el servidor MySQL

mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql
例:
mysqldump -u root -p --all-databases > /opt/all.sql

3) Copia de seguridad completa de algunas tablas en la biblioteca especificada

mysqldump -u root -p[密码] [-d] 库名 [表名1] [表名2] … > /备份路径/备份文件名.sql
#使用“ -d ”选项,说明只保存数据库的表结构
#不使用“ -d ”选项,说明表数据也进行备份
例:
mysqldump -u root -p school class > /opt/school_class.sql

4) Ver el archivo de respaldo

cat /opt/备份的文件 |grep -v "^--" | grep -v "^/" | grep -v "^$"

例:
cat /opt/school_class.sql |grep -v "^--" | grep -v "^/" | grep -v "^$"

3.3 recuperación completa de MySQL

1) Restaurar la base de datos

#“-e”选项,用于指定连接 MySQL 后执行的命令,命令执行完后自动退出
mysql -u root -p -e 'drop database school;'
mysql -u root -p -e 'show databases;'

mysql -u root -p < /opt/school.sql
mysql -u root -p -e 'show databases;'

2) Restaurar la tabla de datos

Nota: Cuando el archivo de copia de seguridad contiene solo la copia de seguridad de la tabla y no contiene la declaración de la biblioteca creada, se debe especificar el nombre de la biblioteca cuando se realiza la operación de importación y la biblioteca de destino debe existir.

mysql -u root -p -e 'drop table school.class;'
mysql -u root -p -e 'show tables from school;'

mysql -u root -p school < /opt/school_class.sql
mysql -u root -p -e 'show tables from school;'

Cuatro, método de recuperación y copia de seguridad incremental de MySQL

4.1 Copia de seguridad incremental de MySQL

1) Encienda la función de registro binario

vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
server-id = 1
binlog_format = MIXED				#指定二进制日志(binlog)的记录格式为 MIXED


#二进制日志(binlog)有3种不同的记录格式:STATEMENT(基于SQL语句)、ROW(基于行)、MIXED(混合模式),默认格式是STATEMENT

systemctl restart mysqld.service
ls -l /usr/local/mysql/data/mysql-bin.*

2) Se puede realizar una copia de seguridad completa de la base de datos o la tabla cada semana

#手动执行备份
mysqldump -u root -p school class > /opt/school_class_$(date +%F).sql
mysqldump -u root -p --all-databases > /opt/allmysql_$(date +%F).sql

#使用crontab -e 计划性任务来执行;每周1凌晨2点对表class和所有的库进行备份
0 2 * * 1 mysqldump -u root -p school class > /opt/school_class_$(date +%F).sql
0 2 * * 1 mysqldump -u root -p --all-databases > /opt/allmysql_$(date +%F).sql

Nota: este tipo de tarea de cronometraje se puede ejecutar en combinación con crontab -e tarea programada

3) Se pueden realizar operaciones de respaldo incrementales todos los días para generar nuevos archivos de registro binarios

mysqladmin -u root -p flush-logs

4) Inserte nuevos datos para simular el aumento o cambio de datos

mysql -u root -p
use school;
insert into class values ('6','qqq','223366','666666','nanjing');
insert into class values ('7','www','666555','777777','changzhou');

5) Genere un nuevo archivo de registro binario nuevamente

mysqladmin -u root -p flush-logs
#之前的步骤4的数据库操作会保存到mysql-bin.000002文件中,之后数据库数据再发生变化则保存在mysql-bin.000003文件中

6) Ver el contenido del archivo de registro binario

cp /usr/local/mysql/data/mysql-bin.000002 /opt/
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002
#--base64-output=decode-rows:使用64位编码机制去解码并按行读取
#-v:显示详细内容

4.2 recuperación incremental de MySQL

1) Recuperación general

(1) Simular los pasos de recuperación de datos perdidos y modificados

mysql -u root -p
use school;
delete from class where id=6;
delete from class where id=7;
select * from class;
quit

mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -p
mysql -u root -p -e "select * from school.class;"

(2) Simular los pasos de recuperación de todos los datos perdidos

mysql -u root -p
use school;
drop table class;
show tables;
quit

mysql -uroot -p school < /opt/school_class_2021-02-24.sql
mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -uroot -p
mysql -u root -p -e "select * from school.class;"

2) Recuperación del punto de interrupción

mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002

#部分二进制文件的内容
......
BEGIN
/*!*/;
##-------------解释:at xxx 表示位置点------------------------------------------------
# at 302
##--------------解释:开头210224 15:45:53表示时间,其他的现在用不到-----------------------------------
#210224 15:45:53 server id 1  end_log_pos 449 CRC32 0xe972def7 	Query	thread_id=6	exec_time=0	error_code=0
##--------------解释:这里是执行的操作语句---------------------
use `school`/*!*/;        <-------------use school;使用数据库
SET TIMESTAMP=1612597553/*!*/; <------------建立时间戳
insert into class values ('6','qqq','223366','666666','nanjing') <-------向表中插入数据
/*!*/;
##---------------------------------------------------------------
# at 449
#210224 15:45:53 server id 1  end_log_pos 480 CRC32 0x5efde826 	Xid = 446
COMMIT/*!*/;
# at 480
#210224 15:45:54 server id 1  end_log_pos 545 CRC32 0x11768895 	Anonymous_GTID	last_committed=1	sequence_number=2	rbr_only=no
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 545
#210224 15:45:54 server id 1  end_log_pos 628 CRC32 0x778ea5fa 	Query	thread_id=6	exec_time=0	error_code=0
SET TIMESTAMP=1612597554/*!*/;
##-------------------------------插入第二个数据--------------------------
BEGIN
/*!*/;
# at 628
#210206 15:45:54 server id 1  end_log_pos 775 CRC32 0x66e3bb53 	Query	thread_id=6	exec_time=0	error_code=0
SET TIMESTAMP=1612597554/*!*/;
insert into class values ('7','www','666555','777777','changzhou')
/*!*/;
# at 775
#210224 15:45:54 server id 1  end_log_pos 806 CRC32 0x7b972395 	Xid = 447
COMMIT/*!*/;
# at 806
#210224 15:48:52 server id 1  end_log_pos 853 CRC32 0x0d77c456 	Rotate to mysql-bin.000003  pos: 4
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
.......

(1) Restaurar según la ubicación

Solo restaure los datos antes de la posición "628", es decir, no restaure los datos de "id = 7"

#模拟数据丢失
mysql -uroot -p123456 school < /opt/school_class_2021-02-24.sql
mysql -uroot -p123456 -e "select * from school.class;"
#到位置点628停止恢复数据
mysqlbinlog --no-defaults --stop-position='628' /opt/mysql-bin.000002 | mysql -uroot -p123456
#查看class表的数据
mysql -uroot -p123456 -e "select * from school.class;"

Restaurar solo los datos de "id = 7", omitir los datos de "id = 6"

#模拟数据丢失
mysql -uroot -p123456 school < /opt/school_class_2021-02-24.sql
mysql -uroot -p123456 -e "select * from school.class;"
#从位置点628开始恢复数据
mysqlbinlog --no-defaults --start-position='628' /opt/mysql-bin.000002 | mysql -uroot -p123456
#查看class表的数据
mysql -uroot -p123456 -e "select * from school.class;"

(2) Recuperación basada en un momento determinado

Solo restaure los datos antes de 210224 15:45:54, es decir, no restaure los datos con "id = 7"

#模拟数据丢失
mysql -uroot -p123456 school < /opt/school_class_2021-02-24.sql
mysql -uroot -p123456 -e "select * from school.class;"
#到2021-02-24 15:45:54截止恢复数据
mysqlbinlog --no-defaults --stop-datetime='2021-02-24 15:45:54' /opt/mysql-bin.000002 | mysql -uroot -p123456
#查看class表的数据
mysql -uroot -p123456 -e "select * from school.class;"

Solo restaure los datos de "id = 7", omita la restauración de datos de "id = 6"

#模拟数据丢失
mysql -uroot -p123456 school < /opt/school_class_2021-02-24.sql
mysql -uroot -p123456 -e "select * from school.class;"
#从2021-02-24 15:45:54开始恢复数据
mysqlbinlog --no-defaults--start-datetime='2021-02-24 15:45:54' /opt/mysql-bin.000002 | mysql -uroot -p123456
#查看class表的数据
mysql -uroot -p123456 -e "select * from school.class;"

Resumen:
si restaura desde un punto de interrupción para restaurar todos los datos antes de una determinada declaración SQL, deténgase en el nodo de ubicación o en el punto de tiempo de la declaración.
Si restaura una determinada declaración SQ y todos los datos posteriores, comience desde el nodo de ubicación o el momento de la declaración

mysqlbinlog --no-defaults --start-position='449' --stop-position='806' /opt/mysql-bin.000002 | mysql -uroot -p #恢复位置从449到806之间的数据

Supongo que te gusta

Origin blog.csdn.net/qq_35456705/article/details/114025431
Recomendado
Clasificación