Conceptos básicos de MySQL (38) Copia de seguridad y recuperación de bases de datos

1 Copia de seguridad física y copia de seguridad lógica

物理备份: Realice una copia de seguridad de los archivos de datos y descargue los archivos físicos de la base de datos en un directorio determinado. La velocidad de recuperación de la copia de seguridad física es relativamente rápida, pero ocupa mucho espacio. Puede utilizar xtrabackupherramientas en MySQL para realizar una copia de seguridad física.

逻辑备份: utilice herramientas para exportar objetos de bases de datos y resumirlos en archivos de respaldo. La velocidad de recuperación de la copia de seguridad lógica es lenta, pero ocupa menos espacio y es más flexible. Las herramientas de copia de seguridad lógicas más utilizadas en MySQL son mysqldump. La copia de seguridad lógica consiste 备份sql语句en ejecutar la instrucción SQL de copia de seguridad durante la recuperación para reproducir los datos de la base de datos.

2 mysqldump implementa una copia de seguridad lógica

2.1 Hacer una copia de seguridad de una base de datos

基本语法:

mysqldump –u 用户名称 –h 主机名称 –p密码 待备份的数据库名称[tbname, [tbname...]]> 备份文件名称.sql

Ejemplo: utilice el usuario root para realizar una copia de seguridad de la base de datos de prueba:

mysqldump -uroot -p test>test.sql #备份文件存储在当前目录下
mysqldump -uroot -p test > /var/lib/mysql/test.sql

备份文件剖析:

-- MySQL dump 10.13 Distrib 8.0.26, for Linux (x86_64)
--
-- Host: localhost Database: test
-- ------------------------------------------------------
-- Server version 8.0.26
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Current Database: `test`
--
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET
utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
USE `test`;
--
-- Table structure for table `student`
--
DROP TABLE IF EXISTS `student`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `student` (
`studentno` int NOT NULL,
`name` varchar(20) DEFAULT NULL,
`class` varchar(20) DEFAULT NULL,
PRIMARY KEY (`studentno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
/*!40101 SET character_set_client = @saved_cs_client */;
INSERT INTO `student` VALUES (1,'张三_back','一班'),(3,'李四','一班'),(8,'王五','二班'),
(15,'赵六','二班'),(20,'钱七','>三班'),(22,'zhang3_update','1ban'),(24,'wang5','2ban');
/*!40000 ALTER TABLE `student` ENABLE KEYS */;
UNLOCK TABLES;
.
.
.
.
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2022-01-07 9:58:23

2.2 Copia de seguridad de todas las bases de datos

Si desea utilizar mysqldump para realizar una copia de seguridad de toda la instancia, puede utilizar el parámetro --all-databaseso :-A

mysqldump -uroot -pxxxxxx --all-databases > all_database.sql

mysqldump -uroot -pxxxxxx -A > all_database.sql

2.3 Hacer una copia de seguridad de parte de la base de datos

Utilice --databasesel -Bparámetro o, seguido del nombre de la base de datos, y varias bases de datos están separadas por espacios. Si se especifica el parámetro de bases de datos, la declaración para crear la base de datos existirá en el archivo de copia de seguridad. Si no se especifica el parámetro, no existirá. La sintaxis es la siguiente:

mysqldump –u user –h host –p --databases [数据库的名称1 [数据库的名称2...]] > 备份文件名称.sql

Ejemplo:

mysqldump -uroot -p --databases test1 test2 >two_database.sql

o

mysqldump -uroot -p -B test1 test2 > two_database.sql

2.4 Hacer una copia de seguridad de algunas tablas

Por ejemplo, haga una copia de seguridad antes de realizar cambios en la tabla. La sintaxis es la siguiente:

mysqldump –u user –h host –p 数据库的名称 [表名1 [表名2...]] > 备份文件名称.sql

Ejemplo: hacer una copia de seguridad de la tabla de libros en la base de datos de prueba

mysqldump -uroot -p test book> book.sql

El contenido del archivo book.sql es el siguiente

[root@node1 ~]# vi book.sql
-- MySQL dump 10.13 Distrib 8.0.26, for Linux (x86_64)
--
-- Host: localhost Database: test
-- ------------------------------------------------------
-- Server version 8.0.26
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `book`
--
DROP TABLE IF EXISTS `book`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `book` (
`bookid` int unsigned NOT NULL AUTO_INCREMENT,
`card` int unsigned NOT NULL,
`test` varchar(255) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`bookid`),
KEY `Y` (`card`)
) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `book`
--
LOCK TABLES `book` WRITE;
/*!40000 ALTER TABLE `book` DISABLE KEYS */;
INSERT INTO `book` VALUES (1,9,NULL),(2,10,NULL),(3,4,NULL),(4,8,NULL),(5,7,NULL),
(6,10,NULL),(7,11,NULL),(8,3,NULL),(9,1,NULL),(10,17,NULL),(11,19,NULL),(12,4,NULL),
(13,1,NULL),(14,14,NULL),(15,5,NULL),(16,5,NULL),(17,8,NULL),(18,3,NULL),(19,12,NULL),
(20,11,NULL),(21,9,NULL),(22,20,NULL),(23,13,NULL),(24,3,NULL),(25,18,NULL),
(26,20,NULL),(27,5,NULL),(28,6,NULL),(29,15,NULL),(30,15,NULL),(31,12,NULL),
(32,11,NULL),(33,20,NULL),(34,5,NULL),(35,4,NULL),(36,6,NULL),(37,17,NULL),
(38,5,NULL),(39,16,NULL),(40,6,NULL),(41,18,NULL),(42,12,NULL),(43,6,NULL),
(44,12,NULL),(45,2,NULL),(46,12,NULL),(47,15,NULL),(48,17,NULL),(49,2,NULL),
(50,16,NULL),(51,13,NULL),(52,17,NULL),(53,7,NULL),(54,2,NULL),(55,9,NULL),
(56,1,NULL),(57,14,NULL),(58,7,NULL),(59,15,NULL),(60,12,NULL),(61,13,NULL),
(62,8,NULL),(63,2,NULL),(64,6,NULL),(65,2,NULL),(66,12,NULL),(67,12,NULL),(68,4,NULL),
(69,5,NULL),(70,10,NULL),(71,16,NULL),(72,8,NULL),(73,14,NULL),(74,5,NULL),
(75,4,NULL),(76,3,NULL),(77,2,NULL),(78,2,NULL),(79,2,NULL),(80,3,NULL),(81,8,NULL),
(82,14,NULL),(83,5,NULL),(84,4,NULL),(85,2,NULL),(86,20,NULL),(87,12,NULL),
(88,1,NULL),(89,8,NULL),(90,18,NULL),(91,3,NULL),(92,3,NULL),(93,6,NULL),(94,1,NULL),
(95,4,NULL),(96,17,NULL),(97,15,NULL),(98,1,NULL),(99,20,NULL),(100,15,NULL);
/*!40000 ALTER TABLE `book` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

Como puede ver, el archivo del libro es similar al archivo de la biblioteca respaldado. La diferencia es que el archivo del libro solo contiene las declaraciones DROP, CREATE e INSERT de la tabla del libro.

Para hacer una copia de seguridad de varias tablas, utilice el siguiente comando, como hacer una copia de seguridad del libro y de las tablas de cuentas:

#备份多张表
mysqldump -uroot -p test book account > 2_tables_bak.sql

2.5 Hacer una copia de seguridad de algunos datos de una sola tabla

A veces una tabla tiene una gran cantidad de datos y solo necesitamos una parte de los datos. Entonces puedes usar la opción --where. A dónde le siguen las condiciones que deben cumplirse.

Ejemplo: hacer una copia de seguridad de los datos con ID inferior a 10 en la tabla de estudiantes:

mysqldump -uroot -p test student --where="id < 10 " > student_part_id10_low_bak.sql

El contenido es el siguiente: la declaración de inserción solo tiene la parte con una identificación menor que 10.

LOCK TABLES `student` WRITE;
/*!40000 ALTER TABLE `student` DISABLE KEYS */;
INSERT INTO `student` VALUES (1,100002,'JugxTY',157,280),(2,100003,'QyUcCJ',251,277),
(3,100004,'lATUPp',80,404),(4,100005,'BmFsXI',240,171),(5,100006,'mkpSwJ',388,476),
(6,100007,'ujMgwN',259,124),(7,100008,'HBJTqX',429,168),(8,100009,'dvQSQA',61,504),
(9,100010,'HljpVJ',234,185);

2.6 Excluir copia de seguridad de ciertas tablas

Si queremos hacer una copia de seguridad de una determinada base de datos, pero algunas tablas tienen una gran cantidad de datos o no están estrechamente relacionadas con el negocio, podemos considerar excluir estas tablas en este momento, de igual manera la opción puede completar esta función --ignore-table.

mysqldump -uroot -p test --ignore-table=test.student > no_stu_bak.sql

Determine que no hay ninguna estructura de tabla de estudiantes en el archivo especificando lo siguiente:

grep "student" no_stu_bak.sql

2.7 Copia de seguridad solo de estructura o solo de datos

Para hacer una copia de seguridad solo de la estructura, puede usar --no-datala opción abreviada -d; para hacer una copia de seguridad solo de los datos, puede usar la opción --no-create-infoabreviada .-t

  • Estructuras de solo respaldo
    mysqldump -uroot -p test--no-data > test_no_data_bak.sql
    #使用grep命令,没有找到insert相关语句,表示没有数据备份。
    [root@node1 ~]# grep "INSERT" test_no_data_bak.sql
    [root@node1 ~]#
    
  • Solo datos de respaldo
    mysqldump -uroot -p test --no-create-info > test_no_create_info_bak.sql
    #使用grep命令,没有找到create相关语句,表示没有数据结构。
    [root@node1 ~]# grep "CREATE" test_no_create_info_bak.sql
    [root@node1 ~]#
    

2.8 La copia de seguridad contiene procedimientos, funciones y eventos almacenados.

La copia de seguridad de Mysqldump no incluye procedimientos almacenados, funciones personalizadas ni eventos de forma predeterminada. Puede utilizar la opción --routineso -Rpara realizar una copia de seguridad de los procedimientos y funciones almacenados, y el parámetro --eventso -Epara realizar una copia de seguridad de los eventos.

Ejemplo: haga una copia de seguridad de toda la biblioteca de pruebas, incluidos los procedimientos y eventos almacenados:

  • Utilice el siguiente SQL para comprobar qué procedimientos almacenados o funciones tiene la biblioteca actual
mysql> SELECT SPECIFIC_NAME,ROUTINE_TYPE ,ROUTINE_SCHEMA FROM
information_schema.Routines WHERE ROUTINE_SCHEMA="test";
+---------------+--------------+----------------+
| SPECIFIC_NAME | ROUTINE_TYPE | ROUTINE_SCHEMA |
+---------------+--------------+----------------+
| rand_num | FUNCTION | test|
| rand_string | FUNCTION | test|
| BatchInsert | PROCEDURE | test|
| insert_class | PROCEDURE | test|
| insert_order | PROCEDURE | test|
| insert_stu | PROCEDURE | test|
| insert_user | PROCEDURE | test|
| ts_insert | PROCEDURE | test|
+---------------+--------------+----------------+
9 rows in set (0.02 sec)

A continuación, haga una copia de seguridad de los datos, funciones y procedimientos almacenados de la biblioteca de pruebas.

mysqldump -uroot -p -R -E --databases test > fun_test_bak.sql

Verifique si la función existe en el archivo de respaldo y podrá ver que la función efectivamente está incluida.

2.9 Opciones comunes de Mysqldump

Otras opciones comúnmente utilizadas para mysqldump son las siguientes:

--add-drop-database:在每个CREATE DATABASE语句前添加DROP DATABASE语句。

--add-drop-tables:在每个CREATE TABLE语句前添加DROP TABLE语句。

--add-locking:用LOCK TABLES和UNLOCK TABLES语句引用每个表转储。重载转储文件时插入得更快。

--all-database, -A:转储所有数据库中的所有表。与使用--database选项相同,在命令行中命名所有数据库。

--comment[=0|1]:如果设置为0,禁止转储文件中的其他信息,例如程序版本、服务器版本和主机。--skipcomments与--comments=0的结果相同。默认值为1,即包括额外信息。

--compact:产生少量输出。该选项禁用注释并启用--skip-add-drop-tables、--no-set-names、--skipdisable-keys和--skip-add-locking选项。

--compatible=name:产生与其他数据库系统或旧的MySQL服务器更兼容的输出,值可以为ansi、MySQL323、MySQL40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_table_options或者no_field_options。

--complete_insert, -c:使用包括列名的完整的INSERT语句。

--debug[=debug_options], -#[debug_options]:写调试日志。

--delete,-D:导入文本文件前清空表。

--default-character-set=charset:使用charsets默认字符集。如果没有指定,就使用utf8。

--delete--master-logs:在主复制服务器上,完成转储操作后删除二进制日志。该选项自动启用-masterdata。

--extended-insert,-e:使用包括几个VALUES列表的多行INSERT语法。这样使得转储文件更小,重载文件时可以加速插入。

--flush-logs,-F:开始转储前刷新MySQL服务器日志文件。该选项要求RELOAD权限。

--force,-f:在表转储过程中,即使出现SQL错误也继续。

--lock-all-tables,-x:对所有数据库中的所有表加锁。在整体转储过程中通过全局锁定来实现。该选项自动关闭--single-transaction和--lock-tables。

--lock-tables,-l:开始转储前锁定所有表。用READ LOCAL锁定表以允许并行插入MyISAM表。对于事务表(例如InnoDB和BDB),--single-transaction是一个更好的选项,因为它根本不需要锁定表。

--no-create-db,-n:该选项禁用CREATE DATABASE /*!32312 IF NOT EXIST*/db_name语句,如果给出--database或--all-database选项,就包含到输出中。

--no-create-info,-t:只导出数据,而不添加CREATE TABLE语句。

--no-data,-d:不写表的任何行信息,只转储表的结构。

--opt:该选项是速记,它可以快速进行转储操作并产生一个能很快装入MySQL服务器的转储文件。该选项默认开启,但可以用--skip-opt禁用。

--password[=password],-p[password]:当连接服务器时使用的密码。

--port=port_num,-P port_num:用于连接的TCP/IP端口号。

--protocol={TCP|SOCKET|PIPE|MEMORY}:使用的连接协议。

--replace,-r –replace和--ignore:控制替换或复制唯一键值已有记录的输入记录的处理。如果指定--replace,新行替换有相同的唯一键值的已有行;如果指定--ignore,复制已有的唯一键值的输入行被跳过。如果不指定这两个选项,当发现一个复制键值时会出现一个错误,并且忽视文本文件的剩余部分。

--silent,-s:沉默模式。只有出现错误时才输出。

--socket=path,-S path:当连接localhost时使用的套接字文件(为默认主机)。

--user=user_name,-u user_name:当连接服务器时MySQL使用的用户名。

--verbose,-v:冗长模式,打印出程序操作的详细信息。

--xml,-X:产生XML输出。

Ejecute el comando de ayuda mysqldump --helppara obtener una lista completa de opciones para una versión específica.

Consejo Si ejecuta mysqldump sin la opción --quick o --opt, mysqldump carga el conjunto de resultados completo en la memoria antes de volcar los resultados. Esta opción puede ser problemática si se descargan bases de datos grandes. Esta opción está habilitada de forma predeterminada, pero se puede deshabilitar con --skip-opt. Si está utilizando la última versión del programa mysqldump para realizar una copia de seguridad de los datos y restaurarlos a una versión anterior del servidor MySQL, no utilice la opción –opt o -e.

3 comando mysql para restaurar datos

Sintaxis básica:

mysql –u root –p [dbname] < backup.sql

3.1 Restaurar una base de datos única desde una copia de seguridad de una sola base de datos

Utilice el usuario raíz para importar a la base de datos la copia de seguridad en el archivo test.sql respaldado en el ejercicio anterior. El comando es el siguiente:
Si el archivo de copia de seguridad contiene declaraciones para crear una base de datos, no necesita especificar el nombre de la base de datos. al restaurar, como se muestra a continuación

mysql -uroot -p < test.sql

De lo contrario, deberá especificar el nombre de la base de datos como se muestra a continuación.

mysql -uroot -p test < test.sql

3.2 Copia de seguridad y recuperación completas

Si ahora tenemos la copia de seguridad completa de ayer y ahora queremos restaurar la copia de seguridad completa, podemos hacer esto:

mysql –u root –p < all.sql
mysql -uroot -pxxxxxx < all.sql

Después de la ejecución, todas las bases de datos del archivo all.sql se restauraron en la base de datos MySQL.

3.3 Restaurar una única base de datos desde una copia de seguridad completa

Puede haber tal demanda. Por ejemplo, solo queremos restaurar una determinada biblioteca, pero tenemos una copia de seguridad de toda la instancia. En este momento, podemos separar la copia de seguridad de una sola biblioteca de la copia de seguridad completa.

Ejemplo:

sed -n '/^-- Current Database: `test`/,/^-- Current Database: `/p' all_database.sql > test.sql
#分离完成后我们再导入test.sql即可恢复单个库

3.4 Restaurar una sola tabla desde una única copia de seguridad de base de datos

Este requisito es bastante común. Por ejemplo, si sabemos qué tabla no funcionó correctamente, podemos usar la recuperación de una sola tabla para restaurarla.
Por ejemplo: tenemos una copia de seguridad de toda la base de datos de prueba, pero debido a un mal funcionamiento de la tabla de clases, necesitamos restaurar esta tabla por separado.

cat test.sql | sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `class`/!d;q' >
class_structure.sql
cat test.sql | grep --ignore-case 'insert into `class`' > class_data.sql
#用shell语法分离出创建表的语句及插入数据的语句后 再依次导出即可完成恢复
use test;
mysql> source class_structure.sql;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> source class_data.sql;
Query OK, 1 row affected (0.01 sec)

4 Copia de seguridad física: copie directamente toda la base de datos

Copie directamente el archivo de la base de datos en MySQL. Este método es el más sencillo y rápido. La ubicación del directorio de la base de datos MySQL no es necesariamente la misma:

  • En la plataforma Windows, el directorio donde MySQL 8.0 almacena la base de datos generalmente es "C:\ProgramData\MySQL\MySQL Server 8.0\Data" u otros directorios definidos por el usuario;
  • En la plataforma Linux, la ubicación del directorio de la base de datos suele ser /var/lib/mysql/;
  • En la plataforma MAC OSX, la ubicación del directorio de la base de datos suele ser "/usr/local/mysql/data"

Pero para garantizar la coherencia de la copia de seguridad. Necesidad de garantizar:

  • Método 1: detenga el servidor antes de realizar la copia de seguridad.
  • Método 2: antes de realizar la copia de seguridad, realice operaciones en tablas relacionadas FLUSH TABLES WITH READ LOCK. Esto permite que otros clientes continúen consultando la tabla mientras se copian los archivos en el directorio de la base de datos. Al mismo tiempo, FLUSH TABLESla declaración garantiza que todas las páginas de índice activas se escriban en el disco duro antes de iniciar la copia de seguridad.

Este método es conveniente y rápido, pero no es el mejor método de respaldo, porque la situación real puede ser 不允许停止MySQL服务器o 锁住表 y la tabla de este método 对InnoDB存储引擎no es adecuada. Para las tablas del motor de almacenamiento MyISAM, esta copia de seguridad y restauración es muy conveniente, pero es mejor usar la misma versión de la base de datos MySQL al restaurar; de lo contrario, los tipos de archivos pueden ser diferentes.

Tenga en cuenta que una vez completada la copia de seguridad física, ejecútela UNLOCK TABLESpara liquidar las modificaciones a la tabla realizadas por otros clientes.

Nota: En el número de versión de MySQL, el primer número indica el número de versión principal. Los archivos de base de datos MySQL con el mismo número de versión principal tienen el mismo formato.

Además, también puede considerar el uso de herramientas relacionadas para implementar la copia de seguridad. Por ejemplo, MySQLhotcopyherramientas. MySQLhotcopy es un script Perl que utiliza LOCK TABLES, FLUSH TABLES y cp o scp para realizar una copia de seguridad rápida de su base de datos. Es la forma más rápida de realizar una copia de seguridad de una base de datos o de una sola tabla, pero solo puede ejecutarse en la máquina donde se encuentra el directorio de la base de datos y solo puede realizar una copia de seguridad de tablas de tipo MyISAM. Se utiliza principalmente antes de mysql5.5.

5 Recuperación física: copiar directamente al directorio de la base de datos

步骤:

1) Demuestra cómo eliminar datos de tablas específicas en la base de datos respaldada

2) Copie los datos de la base de datos respaldados al directorio de datos y reinicie el servidor MySQL

3) Consultar si se restauran los datos de las tablas relevantes. Es necesario utilizar la siguiente operación chown.

要求:

  • Debe asegurarse de que el número de versión principal de la base de datos de la que se realizará la copia de seguridad y el servidor de la base de datos que se restaurará sean los mismos.

    • Porque solo cuando el número de versión principal de la base de datos MySQL es el mismo, se puede garantizar que los tipos de archivos de las dos bases de datos MySQL sean los mismos.
  • Este método es correcto MyISAM类型的表比较有效, pero no está disponible para tablas de tipo InnoDB.

    • Porque el espacio de tabla de la tabla InnoDB no se puede copiar directamente.
  • En el sistema operativo Linux, después de copiar al directorio de la base de datos, asegúrese de cambiar el usuario y el grupo de la base de datos a mysql. El comando es el siguiente:

    chown -R mysql.mysql /var/lib/mysql/dbname
    

Entre ellos, los dos mysql representan el grupo y el usuario respectivamente; el parámetro "-R" puede cambiar el usuario y el grupo de todos los subarchivos en la carpeta; el parámetro "dbname" representa el directorio de la base de datos.

Consejo: la configuración de permisos en el sistema operativo Linux es muy estricta. Normalmente, solo el usuario root y el usuario mysql del grupo de usuarios mysql pueden acceder a la base de datos MySQL, por lo tanto, después de copiar el directorio de la base de datos a la carpeta especificada, asegúrese de usar el comando chown para cambiar el grupo de usuarios de la carpeta. a mysql y el usuario a mysql.para mysql.

6. Exportación e importación de tablas.

6.1 Exportación de tablas

1. Utilice SELECT…INTO OUTFILE para exportar un archivo de texto

En MySQL, puedes usar SELECT…INTO OUTFILEdeclaraciones para exportar el contenido de una tabla a un archivo de texto.

Ejemplo: utilice SELECT…INTO OUTFILE para exportar los registros de la tabla de cuentas en la base de datos de prueba a un archivo de texto.
(1) Seleccione la prueba de la base de datos y consulte la tabla de cuentas. Los resultados de la ejecución son los siguientes.

use test;
select * from account;
mysql> select * from account;
+----+--------+---------+
| id | name | balance |
+----+--------+---------+
| 1 | 张三 | 90 |
| 2 | 李四 | 100 |
| 3 | 王五 | 0 |
+----+--------+---------+
3 rows in set (0.01 sec)

(2) Mysql tiene restricciones de permisos en el directorio exportado de forma predeterminada, lo que significa que cuando usa la línea de comando para exportar, debe especificar el directorio para la operación
.
Consulta el valor de Secure_file_priv:

mysql> SHOW GLOBAL VARIABLES LIKE '%secure%';
+--------------------------+-----------------------+
| Variable_name | Value |
+--------------------------+-----------------------+
| require_secure_transport | OFF |
| secure_file_priv | /var/lib/mysql-files/ |
+--------------------------+-----------------------+
2 rows in set (0.02 sec)

(3) Los resultados anteriores muestran que el valor de la variable Secure_file_priv es /var/lib/mysql-files/, el directorio de exportación está configurado en este directorio y la declaración SQL es la siguiente.

SELECT * FROM account INTO OUTFILE "/var/lib/mysql-files/account.txt";

(4) Ver el archivo /var/lib/mysql-files/account.txt`.

1 张三 90
2 李四 100
3 王五 0

2. Utilice el comando mysqldump para exportar un archivo de texto.

Ejemplo 1 : utilice el comando mysqldump para exportar los registros de la tabla de cuentas en la base de datos de prueba a un archivo de texto

mysqldump -uroot -p -T "/var/lib/mysql-files/" test account

Después de ejecutar el comando mysqldump, los archivos account.sql y account.txt se generan en el directorio especificado /var/lib/mysql-files/.

Abra el archivo account.sql, cuyo contenido contiene la declaración CREATE para crear la tabla de cuentas.

Ejemplo 2 : use mysqldump para exportar la tabla de cuentas en la base de datos de prueba a un archivo de texto. Use la opción CAMPOS, que requiere comas "," para separar los campos y todos los valores de los campos de tipo carácter deben estar entre comillas dobles:

mysqldump -uroot -p -T "/var/lib/mysql-files/" test account --fields-terminatedby=',' --fields-optionally-enclosed-by='\"'

Una vez que la instrucción mysqldump se ejecute correctamente, aparecerán dos archivos account.sql y account.txt en el directorio especificado.

Abra el archivo account.sql, cuyo contenido contiene la declaración CREATE para crear la tabla de cuentas.

3. Utilice el comando mysql para exportar un archivo de texto.

Ejemplo 1 : utilice la declaración mysql para exportar los registros de la tabla de cuentas en los datos de prueba a un archivo de texto:

mysql -uroot -p --execute="SELECT * FROM account;" test> "/var/lib/mysqlfiles/account.txt"

Abra el archivo account.txt, cuyo contenido contiene los datos para crear la tabla de cuentas.

[root@node1 mysql-files]# cat account.txt
id name balance
1 张三 90
2 李四 100
3 王五 0

Ejemplo 2: exporte los registros de la tabla de cuentas de la base de datos de prueba a un archivo de texto y utilice el parámetro –veritcal para dividir los registros condicionales en varias líneas para mostrarlos:

mysql -uroot -p --vertical --execute="SELECT * FROM account;" test > "/var/lib/mysql-files/account_1.txt"

Abra el archivo account_1.txt, cuyo contenido contiene los datos para crear la tabla de cuentas.

Ejemplo 3 : exporte los registros en la tabla de cuentas de la base de datos de prueba a un archivo xml, utilizando el parámetro –xml. Las declaraciones específicas son las siguientes.

mysql -uroot -p --xml --execute="SELECT * FROM account;" test>"/var/lib/mysqlfiles/account_3.xml"
[root@node1 mysql-files]# cat account_3.xml
<?xml version="1.0"?>
<resultset statement="SELECT * FROM account"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<row>
<field name="id">1</field>
<field name="name">张三</field>
<field name="balance">90</field>
</row>
<row>
<field name="id">2</field>
<field name="name">李四</field>
<field name="balance">100</field>
</row>
<row>
<field name="id">3</field>
<field name="name">王五</field>
<field name="balance">0</field>
</row>
</resultset>

Nota: Si desea exportar datos de la tabla a un archivo html, puede usar la opción --html. Luego se puede abrir usando un navegador.

6.2 Importación de tablas

1. Utilice el método LOAD DATA INFILE para importar archivos de texto

Ejemplo 1 : SELECT...INTO OUTFILEExportar los registros de la tabla de cuentas en la base de datos de prueba a un archivo de texto usando

SELECT * FROM test.account INTO OUTFILE '/var/lib/mysql-files/account_0.txt';

Eliminar datos en la tabla de cuentas:

DELETE FROM test.account;

Recuperar datos del archivo de texto account.txt:

LOAD DATA INFILE '/var/lib/mysql-files/account_0.txt' INTO TABLE test.account;

Consulta los datos en la tabla de cuentas:

mysql> select * from account;
+----+--------+---------+
| id | name | balance |
+----+--------+---------+
| 1 | 张三 | 90 |
| 2 | 李四 | 100 |
| 3 | 王五 | 0 |
+----+--------+---------+
3 rows in set (0.00 sec)

Ejemplo 2 : Seleccione la prueba de la base de datos, use SELECCIONAR... EN OUTFILE para exportar los registros en la tabla de cuentas de la base de datos de prueba a un archivo de texto, use la opción CAMPOS y la opción LÍNEAS, requiere comas "," intervalos entre campos, y todos los valores de los campos están entre comillas dobles.

SELECT * FROM test.account INTO OUTFILE '/var/lib/mysql-files/account_1.txt' FIELDS TERMINATED BY ',' ENCLOSED BY '\"';

Eliminar datos en la tabla de cuentas:

DELETE FROM test.account;

Importe datos de /var/lib/mysql-files/account.txt a la tabla de cuentas:

LOAD DATA INFILE '/var/lib/mysql-files/account_1.txt' INTO TABLE test.account FIELDS TERMINATED BY ',' ENCLOSED BY '\"';

Consulta los datos en la tabla de cuentas, el SQL específico es el siguiente:

select * from account;
mysql> select * from account;
+----+--------+---------+
| id | name | balance |
+----+--------+---------+
| 1 | 张三 | 90 |
| 2 | 李四 | 100 |
| 3 | 王五 | 0 |
+----+--------+---------+
3 rows in set (0.00 sec)

2. Utilice mysqlimport para importar archivos de texto

Ejemplo : exporte el archivo account.txt, use comas "," para separar campos y escriba los valores de los campos entre comillas dobles:

SELECT * FROM test.account INTO OUTFILE '/var/lib/mysql-files/account.txt' FIELDS
TERMINATED BY ',' ENCLOSED BY '\"';

Eliminar datos en la tabla de cuentas:

DELETE FROM test.account;

Utilice el comando mysqlimport para importar el contenido del archivo account.txt a la tabla de cuentas de la prueba de la base de datos:

mysqlimport -uroot -p test '/var/lib/mysql-files/account.txt' --fields-terminatedby=',' --fields-optionally-enclosed-by='\

Consulta los datos en la tabla de cuentas:

select * from account;
mysql> select * from account;
+----+--------+---------+
| id | name | balance |
+----+--------+---------+
| 1 | 张三 | 90 |
| 2 | 李四 | 100 |
| 3 | 王五 | 0 |
+----+--------+---------+
3 rows in set (0.00 sec)

7. Migración de bases de datos

7.1 Descripción general

La migración de datos se refiere a seleccionar, preparar, extraer y transformar datos, y 将数据从一个计算机存储系统永久地传输到另一个计算机存储系统的过程. Además, 验证迁移数据的完整性y 退役原来旧的数据存储también se consideran parte del proceso general de migración de datos.

Los motivos para la migración de bases de datos son diversos, incluido el reemplazo, mantenimiento o actualización de servidores o dispositivos de almacenamiento, migración de aplicaciones, integración de sitios web, recuperación ante desastres y migración de centros de datos.

Se pueden adoptar diferentes planes de migración según las diferentes necesidades, pero en términos generales, los planes de migración de datos MySQL se pueden dividir aproximadamente en dos categorías 物理迁移: y 逻辑迁移. Generalmente 自动化se realiza de la mejor manera posible, liberando así a los recursos humanos de tareas tediosas.

7.2 Plan de migración

  • Reubicación física

La migración física es adecuada para la migración general de grandes cantidades de datos. La ventaja de utilizar la solución de migración física es que es relativamente rápida, pero requiere tiempo de inactividad para la migración y requiere que la versión y configuración de MySQL sean las mismas que las del servidor original, lo que también puede causar problemas desconocidos.

La migración física incluye la copia de archivos de datos y el uso de la herramienta de copia de seguridad XtraBackup.

La migración física se puede utilizar entre diferentes servidores. Podemos instalar la misma versión del software de base de datos en el nuevo servidor y crear el mismo directorio. Se recomienda que el archivo de configuración sea el mismo que el de la base de datos original y luego copiar los archivos de datos. y registros de la base de datos original, configure los permisos del grupo de archivos y luego use el comando mysqld para iniciar la base de datos en el nuevo servidor.

  • migración lógica

La migración lógica tiene un alcance de aplicación más amplio y se puede utilizar ya sea 部分迁移o . 全量迁移El método más utilizado para la migración lógica son las herramientas de copia de seguridad como mysqldump.

7.3 Notas sobre la migración

1. Puntos a tener en cuenta al migrar bases de datos de la misma versión

Se refiere al movimiento de bases de datos entre bases de datos MySQL con el mismo número de versión principal.

方式1: Debido a que el número de versión principal de la base de datos MySQL antes y después de la migración es el mismo, la migración de la base de datos se puede lograr copiando el directorio de la base de datos, pero el método de migración física solo es aplicable a las tablas del motor MyISAM. Para las tablas InnoDB, no puede realizar una copia de seguridad de la base de datos copiando archivos directamente.

方式2: La forma más común y segura es usar el comando mysqldump para exportar los datos y luego importarlos usando el comando MySQL en el servidor de la base de datos de destino.

Ejemplo:

#host1的机器中备份所有数据库,并将数据库迁移到名为host2的机器上
mysqldump –h host1 –uroot –p –-all-databases|
mysql –h host2 –uroot –p

En la declaración anterior, el símbolo "|" representa una tubería, que se utiliza para pasar los archivos respaldados por mysqldump al comando mysql; "--all-databases" indica que todas las bases de datos se van a migrar. De esta manera la migración se puede implementar directamente.

2. Puntos a tener en cuenta al migrar entre diferentes versiones de bases de datos

Por ejemplo, muchos servidores solían utilizar la versión 5.7 de la base de datos MySQL. Después del lanzamiento de la versión 8.0, se mejoraron muchos defectos de la versión 5.7, por lo que fue necesario actualizar la base de datos a la versión 8.0.

Las versiones anteriores y las versiones más nuevas de MySQL pueden usar diferentes conjuntos de caracteres predeterminados. Por ejemplo, algunas versiones anteriores usan latin1 como juego de caracteres predeterminado, mientras que la última versión de MySQL usa utf8mb4 como juego de caracteres predeterminado. Si hay datos chinos en la base de datos, es necesario corregirlos durante el proceso de migración 默认字符集进行修改; de lo contrario, es posible que los datos no se muestren correctamente.

Por lo general, una versión superior de la base de datos MySQL lo hace 兼容低版本, por lo que puede migrar desde una versión inferior de la base de datos MySQL a una versión superior de la base de datos MySQL.

3. Puntos a tener en cuenta al migrar entre diferentes bases de datos

La migración entre diferentes bases de datos se refiere a la migración de otros tipos de bases de datos a bases de datos MySQL, o de bases de datos MySQL a otros tipos de bases de datos. No existe una solución universal para este tipo de migración.

Antes de migrar, es necesario comprender la arquitectura de las diferentes bases de datos 比较它们之间的差异. El mismo tipo de datos se define en diferentes bases de datos 关键字可能会不同. Por ejemplo, el campo de fecha en MySQL se divide en FECHA y HORA, mientras que el campo de fecha de ORACLE solo tiene FECHA; hay ntext, Imagen y otros tipos de datos en la base de datos de SQL Server, pero la base de datos MySQL no tiene estos tipos de datos; los tipos ENUM y SET admitidos por MySQL, estos SQL Server La base de datos no lo admite.

SQL语句Además, los fabricantes de bases de datos no diseñan sistemas de bases de datos que cumplan plenamente con los estándares SQL, lo que genera diferencias en el rendimiento de los diferentes sistemas de bases de datos . Por ejemplo, el software SQL Server de Microsoft utiliza declaraciones T-SQL, que contienen declaraciones SQL no estándar y no son compatibles con las declaraciones SQL de MySQL.

Las diferencias entre los diferentes tipos de bases de datos se causan entre sí.Estas 迁移的困难diferencias son en realidad barreras técnicas creadas deliberadamente por empresas comerciales. Sin embargo, la migración entre diferentes tipos de bases de datos no funciona 不是完全不可能. Por ejemplo, puede utilizarlo MyODBCpara implementar la migración entre MySQL y SQL Server. Las herramientas proporcionadas oficialmente por MySQL MySQL Migration Toolkittambién pueden realizar la migración de datos entre diferentes datos. Al migrar MySQL a Oracle, debe usar el comando mysqldump para exportar el archivo sql y luego usar 手动更改la instrucción CREATE en el archivo sql.

7.4 Resumen de migración

Insertar descripción de la imagen aquí

8. He eliminado la base de datos y no me atrevo a huir, ¿qué puedo hacer?

8.1 eliminar: fila eliminada por error

经验之谈:

  1. Una forma más segura de restaurar datos es 恢复出一个备份encontrar una base de datos esclava 临时库, realizar estas operaciones en esta base de datos temporal y luego restaurar los datos de la base de datos temporal confirmada a la base de datos principal. Si modifica directamente la biblioteca principal, puede causar daños a los datos 二次破坏.

  2. Por supuesto, para evitar el borrado accidental de datos, se recomiendan las siguientes sugerencias:

    1. Establezca sql_safe_updatesel parámetro en on. De esta manera, si olvidamos escribir la condición donde en la declaración de eliminación o actualización, o la condición donde no contiene el campo de índice, la ejecución de esta declaración informará un error.

    Si está seguro de eliminar todos los datos en una tabla pequeña, puede agregar una condición donde a la declaración de eliminación, como donde id>=0, cuando se establece sql_safe_updates=on.

    1. Antes de que el código esté en línea, debe pasar por SQL审计.

8.2 truncar/eliminar: eliminar accidentalmente la biblioteca/tabla

Solución:
en este caso, si desea restaurar los datos, debe utilizar una copia de seguridad completa y un registro incremental. Esta solución requiere una copia de seguridad completa periódica en línea y una copia de seguridad binlog en tiempo real.

Cuando se cumplen estas dos condiciones, si alguien borra accidentalmente una biblioteca a las 12 del mediodía, el proceso de recuperación de los datos es el siguiente:

  1. Tome la más reciente 全量备份, suponiendo que se realiza una copia de seguridad de esta base de datos una vez al día y que la última copia de seguridad se realizó ese día 凌晨2点;
  2. Restaurar uno desde la copia de seguridad 临时库;
  3. Desde la copia de seguridad de registros, extraiga los registros después de las 2 a. m.;
  4. Aplique todos estos registros a la biblioteca temporal, excepto las declaraciones que eliminan datos accidentalmente.

8.3 Replicación retrasada de la base de datos en espera

Si tu 非常核心negocio no permite un tiempo de recuperación demasiado largo, puedes considerarlo 搭建延迟复制的备库. El problema con la estructura general de replicación maestro-en espera es que si una tabla en la base de datos maestra se elimina por error, este comando pronto se enviará a todas las bases de datos esclavas, lo que provocará que las tablas de datos de todas las bases de datos esclavas se eliminen por error. . .

La base de datos en espera de replicación retrasada es un tipo especial de base de datos en espera. A través CHANGE MASTER TO MASTER_DELAY = Ndel comando, puede especificar que esta base de datos en espera continuará conectada a la base de datos principal N秒的延迟. Por ejemplo, si configura N en 3600, esto significa que si los datos de la base de datos principal se eliminan accidentalmente y el comando de uso indebido se descubre dentro de 1 hora, el comando no se ha ejecutado en la base de datos en espera de replicación retrasada. En este momento, ejecute stop esclavo en la base de datos en espera y luego use el método introducido anteriormente para omitir el comando de operación incorrecta y recuperar los datos requeridos.

8.4 Métodos para evitar la eliminación accidental de bibliotecas/tablas

  1. 账号分离. El propósito de esto es evitar escribir comandos incorrectos. Por ejemplo:

    • Otorgue permisos DML solo a estudiantes de desarrollo empresarial, pero no trunque ni elimine permisos. Si los desarrolladores comerciales tienen necesidades de DDL, pueden obtener soporte a través del sistema de gestión de desarrollo.
    • Incluso los miembros del equipo de DBA solo deben usar 只读账号cuentas con permisos de actualización cuando sea necesario.
  2. Desarrollar especificaciones operativas. Por ejemplo:

    • Antes de eliminar la tabla de datos, primero debe 对表做改名operar. Luego, observe durante un período de tiempo para asegurarse de que no haya ningún impacto en el negocio antes de eliminar la tabla.
    • Al cambiar el nombre de la tabla, es necesario agregar un sufijo fijo (por ejemplo, agregar _to_be_deleted) al nombre de la tabla y luego la acción de eliminar la tabla debe realizarse a través del sistema de administración. Además, cuando el sistema de gestión elimina tablas, solo puede eliminar tablas con sufijos fijos.

8.5 rm: instancia de MySQL eliminada por error

Para un clúster MySQL con un mecanismo de alta disponibilidad, no hay necesidad de preocuparse rm删除数据. Si simplemente elimina los datos de un nodo, el sistema HA comenzará a funcionar y seleccionará una nueva base de datos principal para garantizar el funcionamiento normal de todo el clúster. Lo que tenemos que hacer es restaurar los datos en este nodo y luego conectarlo a todo el clúster.

Supongo que te gusta

Origin blog.csdn.net/zhufei463738313/article/details/130780726
Recomendado
Clasificación