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

Tabla de contenido

Preparar la clase de mesa

mysql -u root -p

create database school;
use school;
create table class(
id int(10) not null,
name varchar(20) not null,
sex char(2) not null,
cardid varchar(20) not null,
phone varchar(11),
address varchar(50));

desc class;

insert into class values ('1','zhangsan','男','1','111111','南京');
insert into class values ('2','lisi','女','2','222222','苏州');
insert into class values ('3','wangchao','男','3','333333','扬州');
insert into class values ('4','zhanglong','男','4','444444','杭州');
insert into class values ('5','zhaohu','男','5','555555','泰州');
select * from class;

Inserte la descripción de la imagen aquí
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. Clasificación de registros de MySQL

  • Registro de errores
  • Registro de consultas general
  • Registro binario
  • Registro de consultas lento

2. El registro de MySQL está activado

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í
Inserte la descripción de la imagen aquí

3. Ingrese a la base de datos para verificar si el registro correspondiente está abierto

Compruebe si el registro de consultas general está habilitado

show variables like 'general%';

Inserte la descripción de la imagen aquí

Compruebe si el registro binario está encendido

show variables like 'log_bin%';

Inserte la descripción de la imagen aquí

Ver funciones relacionadas con el 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) Configure el método para iniciar una consulta lenta en la base de datos

set global slow_query_log=ON;

Inserte la descripción de la imagen aquí

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

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. Razones de la pérdida de datos

Error de programa Error de
operación humana Error de
operación Fallo de
disco
Desastre (como incendio, terremoto) y robo

3. Clasificación de la copia de seguridad de la base de datos

Desde la perspectiva de la física y la lógica:

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)

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)

Desde la perspectiva de la estrategia de copia de seguridad de la base de datos:

Copia de seguridad completa

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

Respaldo diferencial

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

Respaldo incremental

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

4. Métodos de copia de seguridad habituales

Espera física en frío

  • 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.

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

Habilitar el registro binario para la copia de seguridad incremental

  • Para una copia de seguridad incremental, debe actualizar el registro binario

Copia de seguridad de herramientas de terceros

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

5. Copia de seguridad completa de MySQL

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.

Pros y contras de la copia de seguridad completa
ventaja:

  • La operación de copia de seguridad y restauración es simple y conveniente.
    Desventajas:
  • Hay mucha duplicación de datos.
  • Ocupa mucho espacio de respaldo
  • Tiempo prolongado de copia de seguridad y restauración

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

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

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

1. Copia de seguridad y recuperación en frío física

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

2. copia de seguridad y recuperación de mysqldump

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

Realice una 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

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

Ver archivos de respaldo

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

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

3. MySQL está completamente restaurado

Restaurar 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;'

Restaurar tabla de datos

Cuando el archivo de copia de seguridad solo contiene la copia de seguridad de la tabla y no contiene la declaración de la biblioteca creada, el nombre de la biblioteca debe especificarse 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

1. Copia de seguridad incremental de MySQL

Habilitar 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.*

Copia de seguridad completa de la base de datos o la tabla todas las semanas

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

#手动执行备份
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

Se pueden realizar operaciones de respaldo incrementales todos los días para generar nuevos archivos de registro binarios (por ejemplo, mysql-bin.000002)

mysqladmin -u root -p flush-logs

Insertar nuevos datos para simular el aumento o cambio de datos

mysql -u root -p
use school;
insert into class values ('6','zzz','男','897656','666666','南京');
insert into class values ('7','aaa','女','098765','777777','苏州');

Genere un nuevo archivo de registro binario nuevamente (por ejemplo, mysql-bin.000003)

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

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:显示详细内容

2. Recuperación incremental de MySQL

Recuperación general

Simule 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;"

Simule 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-06.sql
mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -uroot -p
mysql -u root -p -e "select * from school.class;"

Recuperación de punto de interrupción

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

#部分二进制文件的内容
......
BEGIN
/*!*/;
##-------------解释:at xxx 表示位置点------------------------------------------------
# at 302
##--------------解释:开头210206 15:45:53表示时间,其他的现在用不到-----------------------------------
#210206 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','zzz','男','897656','666666','南京') <-------向表中插入数据
/*!*/;
##---------------------------------------------------------------
# at 449
#210206 15:45:53 server id 1  end_log_pos 480 CRC32 0x5efde826 	Xid = 446
COMMIT/*!*/;
# at 480
#210206 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
#210206 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','aaa','女','098765','777777','苏州')
/*!*/;
# at 775
#210206 15:45:54 server id 1  end_log_pos 806 CRC32 0x7b972395 	Xid = 447
COMMIT/*!*/;
# at 806
#210206 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 ;
.......

Recuperación basada en la ubicación
Solo restaure los datos antes de la posición "628", es decir, no restaure los datos con "id = 7"

#模拟数据丢失
mysql -uroot -p123456 school < /opt/school_class_2021-02-06.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-06.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;"

Recuperación en un momento determinado
Solo restaure los datos antes de 210206 15:45:54, es decir, no restaure los datos con "id = 7"

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

Supongo que te gusta

Origin blog.csdn.net/weixin_51616026/article/details/113945573
Recomendado
Clasificación