Este artículo lo lleva a comprender el directorio de datos de MySQL

prefacio

Sabemos que los motores de almacenamiento como InnoDB y MyISAM almacenan tablas en disco, y el material que usa el sistema operativo para administrar discos también se denomina sistema de archivos, por lo que de una manera más profesional es: como InnoDB, los motores de almacenamiento como MyISAM almacenan tablas en el sistema de archivos. Cuando queramos leer datos, estos motores de almacenamiento leerán los datos del sistema de archivos y nos los devolverán.Cuando queramos escribir datos, estos motores de almacenamiento volverán a escribir los datos en el sistema de archivos. Este capítulo es para aprender cómo se almacenan los datos de los dos motores de almacenamiento InnoDB y MyISAM en el sistema de archivos.

1. Directorio de datos MySQL

Cuando se inicia el programa del servidor MySQL, cargará algunos archivos en un determinado directorio del sistema de archivos, y luego los datos generados durante la operación también se almacenarán en algunos archivos en este directorio. Este directorio se denomina directorio de datos. es necesario conocer en detalle cuales son las cosas importantes en este directorio.

1.1 La diferencia entre el directorio de datos y el directorio de instalación

Solo hemos tocado el directorio de instalación de MySQL antes (podemos especificarlo nosotros mismos al instalar MySQL), y hemos enfatizado el muy importante directorio bin debajo de este directorio de instalación, que almacena muchos comandos para controlar programas de cliente y programas de servidor (Muchos archivos ejecutables, ej mysql., mysqld, mysqld_safeetc. docenas). El directorio de datos se utiliza para almacenar datos generados por MySQL durante la operación.

1.2 Cómo determinar el directorio de datos de MySQL

Después de hablar durante mucho tiempo, ¿en qué ruta almacena MySQL los datos? De hecho, el directorio de datos corresponde a una variable de sistema datadir.Podemos comprobar el valor de esta variable de sistema después de usar el cliente para establecer una conexión con el servidor.

mysql> show variables like '%datadir%';
+---------------+--------------------------+
| Variable_name | Value                    |
+---------------+--------------------------+
| datadir       | /data/mysql/my3306/data/ |
+---------------+--------------------------+
1 row in set (0.00 sec)

Como se puede ver en los resultados, el directorio de datos MySQL en mi computadora es/data/mysql/my3306/data/

En segundo lugar, la estructura del directorio de datos.

¿Qué datos genera MySQL durante la operación? Por supuesto, contendrá los datos de usuario de las bases de datos, tablas, vistas y disparadores que creamos. Además de estos datos de usuario, MySQL también creará algunos otros datos adicionales para el mejor funcionamiento del programa. Echemos un vistazo más de cerca. en este Contenido del directorio de datos.

2.1 Representación de la base de datos en el sistema de archivos

Cada vez que creamos una base de datos usando la instrucción create database nombre-base de datos, ¿qué sucede realmente en el sistema de archivos? De hecho, es muy simple, cada base de datos corresponde a un subdirectorio dentro del directorio de datos, o corresponde a una carpeta, cada vez que creamos una nueva base de datos, MySQL hará esto por nosotros:

  • Cree un subdirectorio (o carpeta) con el mismo nombre que el nombre de la base de datos en el directorio de datos

Digamos que verificamos qué bases de datos hay actualmente en mi computadora:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
5 rows in set (0.10 sec)

Se puede ver que actualmente hay 5 bases de datos en mi computadora, entre las cuales la base de datos testdb está personalizada por nosotros, y las 4 bases de datos restantes pertenecen a la base de datos del sistema que viene con MySQL. Echemos un vistazo al contenido del directorio de datos en mi computadora:

[root@mysql2 data]# ll
总用量 91928
-rw-r----- 1 mysql mysql       56 425 00:30 auto.cnf
-rw------- 1 mysql mysql     1676 425 00:30 ca-key.pem
-rw-r--r-- 1 mysql mysql     1112 425 00:30 ca.pem
-rw-r--r-- 1 mysql mysql     1112 425 00:30 client-cert.pem
-rw------- 1 mysql mysql     1680 425 00:30 client-key.pem
-rw-r----- 1 mysql mysql   245760 515 12:24 #ib_16384_0.dblwr
-rw-r----- 1 mysql mysql  8634368 52 23:04 #ib_16384_1.dblwr
-rw-r----- 1 mysql mysql     3863 512 19:23 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 515 12:23 ibdata1
-rw-r----- 1 mysql mysql 12582912 515 12:21 ibtmp1
drwxr-x--- 2 mysql mysql     4096 515 12:21 #innodb_redo
drwxr-x--- 2 mysql mysql      187 515 12:21 #innodb_temp
drwxr-x--- 2 mysql mysql      143 425 00:30 mysql
-rw-r----- 1 mysql mysql        5 515 12:21 mysql2.pid
-rw-r----- 1 mysql mysql     1492 58 13:01 mysqld-auto.cnf
-rw-r----- 1 mysql mysql 26214400 515 12:23 mysql.ibd
drwxr-x--- 2 mysql mysql     8192 425 00:30 performance_schema
-rw------- 1 mysql mysql     1676 425 00:30 private_key.pem
-rw-r--r-- 1 mysql mysql      452 425 00:30 public_key.pem
-rw-r--r-- 1 mysql mysql     1112 425 00:30 server-cert.pem
-rw------- 1 mysql mysql     1676 425 00:30 server-key.pem
drwxr-x--- 2 mysql mysql       28 425 00:30 sys
drwxr-x--- 2 mysql mysql       87 515 12:21 testdb
-rw-r----- 1 mysql mysql 16777216 515 12:24 undo_001
-rw-r----- 1 mysql mysql 16777216 515 12:24 undo_002

Por supuesto, hay muchos archivos y subdirectorios en este directorio de datos, pero si observa detenidamente, a excepción de la base de datos del sistema information_schema, otras bases de datos tienen subdirectorios correspondientes en el directorio de datos. Este esquema de información es bastante especial. Al diseñar MySQL, su implementación se trató de manera especial. No se utilizó el directorio de la base de datos correspondiente. Simplemente ignoramos su existencia.

2.2 Visualización de tablas en el sistema de archivos

Por ejemplo, creamos una tabla llamada demo8 en la base de datos testdb:

mysql> use testdb;
Database changed

mysql> create table demo8 (c1 int);
Query OK, 0 rows affected (0.14 sec)

Luego se creará un archivo llamado demo8.frm en el subdirectorio correspondiente a la base de datos testdb para describir la estructura de la tabla. Vale la pena señalar que el sufijo .frm se almacena en formato binario y se distorsionará si lo abrimos directamente ~

Sabemos cómo almacenar el archivo que describe la estructura de la tabla, entonces, ¿en qué archivo se almacenan los datos de la tabla? En este tema, los diferentes motores de almacenamiento tienen divergencias. Echemos un vistazo a qué archivos usan InnoDB y MyISAM para guardar los datos en la tabla.

2.2.1 Cómo InnoDB almacena datos

Nos hemos centrado en algunos de los principios de implementación de InnoDB antes, y ahora deberíamos estar familiarizados con los siguientes conocimientos:

  • InnoDB en realidad usa páginas como la unidad básica para administrar el espacio de almacenamiento y el tamaño de página predeterminado es de 16 KB.
  • Para el motor de almacenamiento InnoDB, cada índice corresponde a un árbol B+, y cada nodo del árbol B+ es una página de datos, y las páginas de datos no necesitan ser físicamente continuas, porque hay una lista doblemente enlazada entre las páginas de datos. mantener el orden de estas páginas.
  • Los nodos hoja del índice agrupado de InnoDB almacenan registros de usuario completos, es decir, el llamado índice son datos y los datos son índices.

Para administrar mejor estas páginas, al diseñar InnoDB se propuso el concepto de table space o file space (nombre en inglés: table space o espacio de archivos), este table space es un concepto abstracto, que puede corresponder a una o más páginas en el sistema de archivos Múltiples archivos reales (el número de archivos correspondientes a diferentes tablespaces puede ser diferente). Cada espacio de tabla se puede dividir en muchas, muchas páginas, y los datos de nuestra tabla se almacenan en ciertos archivos en un espacio de tabla determinado. Al diseñar InnoDB, el espacio de la tabla se divide en muchos tipos diferentes, echemos un vistazo uno por uno.

Espacio de tablas del sistema (espacio de tablas del sistema)

Este llamado espacio de tablas del sistema puede corresponder a uno o más archivos reales en el sistema de archivos. De manera predeterminada, InnoDB creará un archivo llamado ibdata1 con un tamaño de 12M en el directorio de datos. Este archivo corresponde al espacio de tablas del sistema en A representación en el sistema de archivos. ¿Por qué sólo 12M? Este punto se agota antes de insertar muchos datos, jaja, eso es porque este archivo es un archivo llamado autoexpandible, es decir, aumentará automáticamente el tamaño del archivo cuando no sea suficiente.

Por supuesto, si desea que el tablespace del sistema se corresponda con varios archivos reales en el sistema de archivos, o simplemente siente que el nombre del archivo ibdata1 original es feo, puede configurar la ruta del archivo correspondiente y su tamaño cuando se inicia MySQL, por ejemplo, nosotros modifíquelo como
este archivo de configuración:

[server]
innodb_data_file_path=data1:512M;data2:512M:autoextend

De esta forma, estos dos archivos 512M se crearán como tablespace del sistema después de que se inicie MySQL, y la extensión automática indica que si estos dos archivos no son suficientes, el tamaño del archivo data2 se ampliará automáticamente.

También podemos configurar la ruta del archivo correspondiente al tablespace del sistema que no está en el directorio de datos, o incluso configurarlo en una partición de disco separada.Los parámetros de inicio involucrados son innodb_data_file_path e innodb_data_home_dir.La lógica de configuración específica es bastante complicada, por lo que no Más molesto, si sabe qué parámetro cambiar, puede modificar el archivo correspondiente al tablespace del sistema y, si es necesario, simplemente verifíquelo en el documento oficial
.

Una cosa a tener en cuenta es que en un servidor MySQL, solo hay una copia del espacio de tablas del sistema.

Espacio de tabla independiente (espacio de tabla de archivo por tabla)

En MySQL5.6.6 y versiones posteriores, InnoDB no almacena los datos de cada tabla en el table space del sistema por defecto, sino que crea un table space independiente para cada tabla, es decir cuantas tablas hemos creado, hay como tantos espacios de mesa independientes como los hay. Si utiliza un espacio de tabla independiente para almacenar datos de la tabla, se creará un archivo que representa el espacio de tabla independiente en el directorio correspondiente a la base de datos a la que pertenece la tabla. El nombre del archivo es el mismo que el nombre de la tabla, pero una extensión de Se agrega .ibd Por lo tanto, el nombre completo del archivo es este:

表名.ibd

Por ejemplo, si usamos un espacio de tabla independiente para almacenar la tabla demo8 en la base de datos testdb, estos dos archivos se crearán para la tabla demo8 en el directorio testdb correspondiente a la base de datos donde se encuentra la tabla:

demo8.frm
demo8.ibd

El archivo demo8.ibd se utiliza para almacenar los datos y los índices en la tabla demo8. Por supuesto, también podemos especificar si usar el espacio de tablas del sistema o un espacio de tablas independiente para almacenar datos. Esta función está
controlada por el parámetro de inicio innodb_file_per_table. Por ejemplo, cuando queremos almacenar deliberadamente datos de tablas en el espacio de tablas del sistema, podemos hacer esto al iniciar la configuración del servidor MySQL:

[server]
innodb_file_per_table=0

Cuando innodb_file_per_tableel valor de innodb_file_per_table es 0, significa usar el espacio de tablas del sistema; cuando el valor de innodb_file_per_table es 1, significa usar un espacio de tablas independiente. Sin embargo, el parámetro innodb_file_per_table solo funciona para tablas recién creadas y no funciona para tablas que ya han asignado espacios de tabla. Si queremos transferir una tabla que ya existe en el tablespace del sistema a un tablespace independiente, podemos usar la siguiente sintaxis:

alter table 表名 tablespace [=] innodb_file_per_table;

O transfiera una tabla que ya existe en un tablespace independiente al tablespace del sistema, puede usar la siguiente sintaxis:

alter table 表名 tablespace [=] innodb_system;

Los corchetes expandidos = opcional Por ejemplo, si queremos mover la tabla demo8 del espacio de tablas independiente al espacio de tablas del sistema, podemos escribir:

alter table demo8 tablespace innodb_system;

Otros tipos de tablespaces

Con el desarrollo de MySQL, además de los dos espacios de tabla anteriores, ahora se proponen algunos tipos diferentes de espacios de tabla, como espacio de tabla general (espacio de tabla general), espacio de tabla de deshacer (espacio de tabla de deshacer), espacio de tabla temporal (espacio de tabla temporal
) , etc., no entraremos en detalles sobre la situación específica, y lo mencionaremos cuando se use.

Cabe señalar que la tabla del motor de almacenamiento innodb en la versión MySQL8 no tiene un archivo frm, sino que se fusiona en el archivo *.ibd

Sugerencias:
Oracle transfiere oficialmente la información del archivo frm y más información a la información del diccionario serializado ( Serialized DictionaryInformation,SDI), y SDI se escribe dentro del archivo ibd. MySQL 8.0 pertenece a Oracle, por la misma razón.
Para extraer información SDI de archivos IBD, Oracle proporciona una aplicación ibd2sdi.
Ver la estructura de la tabla:
ibd2sdi --dump-file=demo8.txt demo8.ibd

2.2.2 Cómo almacena MyISAM los datos de las tablas

Bueno, después de estudiar el tablespace del sistema y el tablespace independiente de InnoDB, ahora es el turno de MyISAM. Los índices en MyISAM son todos índices secundarios, y los datos e índices del motor de almacenamiento se almacenan por separado. Por lo tanto, se utilizan diferentes archivos en el sistema de archivos para almacenar archivos de datos y archivos de índice. Además, a diferencia de InnoDB, MyISAM no tiene el llamado espacio de tabla. Los datos de la tabla se almacenan en el subdirectorio de la base de datos correspondiente. Si la tabla demo8 usa el motor de almacenamiento MyISAM, entonces estará en el directorio testdb correspondiente a la base de datos donde se encuentra La tabla de prueba crea estos tres archivos:
demo8.frm
demo8.MYD
demo8.MYI

Entre ellos test.MYD, el archivo de datos que representa la tabla es el registro de usuario que insertamos; demo8.MYIel archivo de índice que representa la tabla, el índice que creamos para la tabla se colocará en este archivo.

Pero el nombre de este archivo de estructura de tabla es diferente en las versiones 5.7 y 8.0, pero todas almacenan la estructura de tabla

  • 5.7 es xxx.frm
  • 8.0 es xxx.sdi

2.3 Representación de vistas en el sistema de archivos

Sabemos que una vista en MySQL es en realidad una tabla virtual, que es solo un alias de una declaración de consulta determinada, por lo que no es necesario almacenar datos reales al almacenar una vista, solo se debe almacenar su estructura. Al igual que la tabla, el archivo que describe la estructura de la vista también se almacenará en el subdirectorio correspondiente a la base de datos a la que pertenece, y solo se almacenará un archivo con el nombre de vista .frm

2.4 Otros documentos

Además de los datos almacenados por el usuario como se mencionó anteriormente, el directorio de datos también incluye algunos archivos adicionales para un mejor funcionamiento del programa, incluidos principalmente este tipo de archivos:

  • archivo de proceso del servidor

    Sabemos que cada vez que se ejecuta un programa de servidor MySQL, significa iniciar un proceso. El servidor MySQL escribirá su propio ID de proceso en un archivo.

  • archivo de registro del servidor

    Durante la ejecución del servidor, se generarán varios registros, como registros de consultas regulares, registros de errores, registros binarios, registros de rehacer, etc. Cada uno de estos registros tiene su propio propósito, que se explicará más adelante.

  • Archivos de claves y certificados SSL y RSA predeterminados/generados automáticamente

    Principalmente algunos archivos creados para la comunicación segura entre cliente y servidor.

3. El impacto del sistema de archivos en la base de datos

Debido a que los datos de MySQL se almacenan en el sistema de archivos, deben estar restringidos por el sistema de archivos, lo cual es más obvio en la denominación de las bases de datos y las tablas, la S y el rendimiento de las tablas, como los siguientes aspectos:

  • El nombre de la base de datos y el nombre de la tabla no deben exceder la longitud máxima permitida por el sistema de archivos,
    cada base de datos corresponde a un subdirectorio del directorio de datos, y el nombre de la base de datos es el nombre de este subdirectorio, cada tabla generará un archivo con el mismo nombre como el nombre de la tabla en el subdirectorio de la base de datos El archivo .ibd, si es un espacio de tablas independiente de InnoDB o utiliza el motor MyISAM, habrá otros archivos con el mismo nombre que el nombre de la tabla. La longitud de estos directorios o nombres de archivos está limitada por la longitud permitida por el sistema de archivos

  • El problema de los caracteres especiales
    Para evitar la situación de que el sistema de archivos no admita algunos caracteres especiales en el nombre de la base de datos y el nombre de la tabla, MySQL inyectará todos los caracteres en el nombre de la base de datos y el nombre de la tabla, excepto los números y las letras latinas en el nombre del archivo. La forma del valor codificado @+ como nombre de archivo. Por ejemplo, el nombre de la tabla que creamos es 'demo8?'. Dado que ? no pertenece a números ni a letras latinas, se asignará a un valor codificado, por lo que el nombre del archivo .ibd correspondiente a esta tabla se convierte en demo8 @003f.ibd.

  • La longitud del archivo está limitada por la longitud máxima del sistema de archivos.Para
    el espacio de tabla independiente de InnoDB, los datos de cada tabla se almacenarán en un archivo .ibd con el mismo nombre que el nombre de la tabla; para el motor de almacenamiento MyISAM, los datos y los índices se almacenarán por separado en los archivos .MYD y .MYI con el mismo nombre que la tabla. Estos archivos crecen a medida que se agregan más registros a la tabla y su tamaño está limitado por el tamaño de archivo máximo admitido por el sistema de archivos.

4. Introducción a la base de datos del sistema MySQL

Anteriormente mencionamos varias bases de datos del sistema de MySQL. Estas bases de datos contienen información necesaria durante la ejecución del servidor MySQL y cierta información sobre el estado de ejecución. Echémosle un vistazo ahora.

  • El núcleo de la base de datos mysql
    , almacena información de autoridad y cuenta de usuario de MySQL, algunos procedimientos almacenados, información de definición de eventos, cierta información de registro generada durante la operación, cierta información de ayuda e información de zona horaria, etc.

  • La base de datos information_schema
    contiene información sobre todas las demás bases de datos mantenidas por el servidor MySQL, como qué tablas, vistas, disparadores, columnas, índices, etc. Esta información no son datos reales del usuario, sino información descriptiva, a veces llamada metadatos.

  • La base de datos performance_schema
    almacena principalmente cierta información de estado durante la ejecución del servidor MySQL, que puede considerarse como la supervisión del rendimiento del servidor MySQL. Incluyendo estadísticas de qué declaraciones se han ejecutado recientemente, cuánto tiempo se dedica a cada etapa del proceso de ejecución, uso de memoria y otra información.

  • La base de datos sys
    combina principalmente information_schema y performance_schema en forma de vistas, de modo que los programadores puedan comprender más fácilmente cierta información de rendimiento del servidor MySQL.

Cómo usar estas cuatro bases de datos del sistema debe referirse a los documentos oficiales, por lo que no hay mucho análisis aquí ~

Hasta ahora, el estudio de hoy ha terminado, espero que te conviertas en un yo indestructible
~~~

No puedes conectar los puntos mirando hacia adelante; solo puedes conectarlos mirando hacia atrás. Así que tienes que confiar en que los puntos se conectarán de alguna manera en tu futuro. Tienes que confiar en algo: tu instinto, destino, vida, karma, lo que sea. Este enfoque nunca me ha defraudado y ha marcado una gran diferencia en mi vida.

Si mi contenido te es útil, por favor 点赞, 评论,, 收藏la creación no es fácil, el apoyo de todos es la motivación para que yo persevere

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/liang921119/article/details/130698314
Recomendado
Clasificación