Instalar la base de datos MySQL 8.0.32
prefacio
Hoy, aprendamos el principio y el proceso de la sincronización maestro-esclavo de la base de datos. La base de datos se utiliza principalmente para almacenar datos WEB, que es extremadamente importante en las empresas. Echémosle un vistazo juntos.
1.1 El propósito de la base de datos como maestro-esclavo
La replicación maestro-esclavo de MySQL se usa ampliamente en pequeñas y medianas empresas y grandes empresas. El propósito de la replicación maestro-esclavo de MySQL es lograr una copia de seguridad redundante de la base de datos y sincronizar los datos de la base de datos maestra con la base de datos esclava a intervalos regulares. la base de datos del enmascarador está inactiva, la base de datos de la aplicación WEB se puede configurar Cambie rápidamente a la base de datos esclava para garantizar una alta disponibilidad de las aplicaciones WEB.
1.2 Arquitectura del principio maestro-esclavo
La sincronización maestro-esclavo de MySQL requiere al menos dos servidores, uno para la biblioteca maestra y otro para la biblioteca esclava. Para lograr la replicación, primero debe habilitar la función de registro bin-log en el maestro, y el registro bin-log es utilizado para grabar en la biblioteca maestra Las instrucciones SQL para agregar, eliminar, modificar y actualizar las operaciones ejecutadas en , deben abrir tres subprocesos en todo el proceso, a saber, el maestro inicia el subproceso IO y el esclavo inicia el subproceso IO y el hilo SQL.
1. Preparar el entorno experimental
Este experimento requiere dos servidores, uno es el maestro y el otro es el esclavo, la preparación antes del experimento requiere la operación de ambos servidores.
1.1 Desactivar selinux y cortafuegos
Si es necesario, aún se recomienda apagar selinux. El firewall puede depender de la situación. Puede apagar el firewall directamente si hace sus propios experimentos.
#关闭防火墙
systemctl stop firewalld
iptables -F
#关闭selinux
setenforce 0
1.2 Ver la IP local
Verifique la IP local y pruebe si puede hacer ping a www.baidu.com
ifconfig
192.168.116.166 #第一台服务器IP作为主master
192.168.116.128 #第二台服务器IP作为从slave
1.3 Versión de la base de datos del servidor
Ambas versiones del servidor son CentOS7.9
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
La base de datos usa la versión comunitaria MySQL 8.0 para hacer este experimento
dirección de descarga del paquete rpm
El paquete rpm usado en este experimento (versión comunitaria MySQL 8.0 ) puede hacer clic directamente en el anterior para saltar, o puede copiar directamente este enlace: http:/ / repo.mysql.com/mysql80-community-release-el7.rpm
muestra en forma:
versión del servidor | IP | versión de la base de datos |
---|---|---|
CentOS7.9.2009 | 192.168.116.166 (maestro principal) | MySQL8.0.32 Edición de la comunidad |
CentOS7.9.2009 | 192.168.116.128 (desde esclavo) | MySQL8.0.32 Edición de la comunidad |
2. Instalar MySQL8.0
Aquí también está la necesidad de instalar la base de datos en ambos servidores.
2.1 Borrar el paquete que viene con CentOS7
En CentOS7, los archivos y paquetes de mariadb se instalan de manera predeterminada, y estos deben eliminarse primero; de lo contrario, afectará las instalaciones posteriores.
#清空现有的mariadb和mysql相关的文件
[root@localhost ~]# rpm -qa | grep mysql
[root@localhost ~]# rpm -qa | grep mariadb
mariadb-libs-5.5.68-1.el7.x86_64
[root@localhost ~]# rpm -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps
A continuación, busque archivos sobre mysql y mariadb para eliminar.
[root@localhost ~]# find / -name mariadb
[root@localhost ~]# find / -name mysql
/etc/selinux/targeted/active/modules/100/mysql
/usr/lib64/mysql
[root@localhost ~]# rm -rf /etc/selinux/targeted/active/modules/100/mysql /usr/lib64/mysql
2.2 Descargar e instalar la base de datos 8.0
Use wget para descargar la fuente rpm copiada del sitio web oficial anterior.Si el comando wget no está disponible, primero debe descargar el comando wget.
– se puede copiar directamente
yum install wget -y
wget http://repo.mysql.com/mysql80-community-release-el7.rpm
rpm -ivh mysql80-community-release-el7.rpm
yum install mysql-community-server
Después de instalarlos, puede iniciar el servicio directamente;
#启动服务
systemctl restart mysqld
2.3 Encuentra la contraseña de inicialización
Las contraseñas de inicialización de las dos computadoras son diferentes. Primero puede averiguar las contraseñas y luego modificar las contraseñas de la base de datos de las dos computadoras para que sean iguales.
#查找初始化密码
grep -i 'password' /var/log/mysqld.log
2023-03-23T06:39:43.463553Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: q_gkjqeR1iGA
La contraseña de la base de datos sigue a los dos puntos:q_gkjqeR1iGA
2.4 Modificar la contraseña de la base de datos
Se recomienda cambiar las contraseñas de las dos bases de datos para que sean iguales para facilitar las pruebas posteriores.
#使用密码登录数据库修改成新密码
[root@localhost ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.32
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> alter user 'root'@'localhost' identified by '#Admin$5^!';
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
Cambiar declaración de contraseña
alter user 'root'@'localhost' identified by '#Admin$5^!';
En MySQL8.0, la contraseña debe modificarse lo más complicada posible para pasar, y puede usar la declaración para ver el grado de complejidad.
mysql> show variables like 'validate%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password.check_user_name | ON |
| validate_password.dictionary_file | |
| validate_password.length | 8 |
| validate_password.mixed_case_count | 1 |
| validate_password.number_count | 1 |
| validate_password.policy | MEDIUM |
| validate_password.special_char_count | 1 |
+--------------------------------------+--------+
7 rows in set (0.00 sec)
Si habilitar la verificación de contraseña de usuario.
La ubicación donde se almacena el archivo de contraseña.
La longitud de la contraseña es de al menos 8
caracteres. El número de letras mayúsculas y minúsculas es de al menos 1.
Contiene al menos un número
. Establezca el nivel de la contraseña El nivel predeterminado es medio y
contiene al menos un carácter.
El contenido anterior debe operarse en ambos servidores.
3. Operación en el maestro principal
Lo anterior define el maestro principal como la IP de este servidor: 192.168.116.166
Para ver visualmente en qué servidor se está ejecutando, aquí está la modificación del nombre de host, para que sea fácil de distinguir.
3.1 Modificar temporalmente el nombre de host
[root@localhost ~]# hostname master
[root@localhost ~]# bash
[root@master ~]#
3.2 Configuración de la base de datos maestra
Cree un usuario de base de datos slave21, hágalo remoto y establezca una contraseña
[root@master ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.32 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create user 'slave21'@'%' identified with mysql_native_password by '#slvae21!@3LL';
Query OK, 0 rows affected (0.00 sec)
mysql> grant replication slave on *.* to 'slave21'@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for 'slave21'@'%';
+-------------------------------------------------+
| Grants for slave21@% |
+-------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO `slave21`@`%` |
+-------------------------------------------------+
1 row in set (0.00 sec)
Mirando esta imagen, parece que hay mucho contenido, pero en realidad solo hay unas pocas oraciones;
create user 'slave21'@'%' identified with mysql_native_password by '#slvae21!@3LL';
El significado de esta declaración es crear un usuario esclavo21. El nombre del usuario puede definirlo usted mismo; @'%' significa que puede usar el inicio de sesión remoto en la base de datos. Esta declaración es una redacción fija de MySQL8.0,
identified with mysql_native_password by
que significa establecer una contraseña para él.
grant replication slave on *.* to 'slave21'@'%';
Esta declaración significa autorizar los permisos de la base de datos para este usuario,
*.*
básicamente otorgar todos los permisos, el primer * significa todas las bases de datos y el segundo significa las tablas de la base de datos.
flush privileges;
Esta declaración significa actualizar la base de datos, de modo que el contenido establecido previamente se pueda sincronizar con la base de datos.
show grants for 'slave21'@'%';
Compruebe si los permisos establecidos anteriormente se han escrito en la base de datos y el contenido que se muestra indica que la escritura se ha realizado correctamente.
3.3 Modificar el archivo de configuración de la base de datos
[root@master ~]# vim /etc/my.cnf
[root@master ~]# sed 4,+4p -n /etc/my.cnf
[mysqld]
server-id=21
log-bin=mysql-bin
binlog_do_db=test
binlog_ignore_db=mysql
#重启服务
[root@master ~]# systemctl restart mysqld
server-id=21 El ID único del servicio de base de datos
log-bin=mysql-bin Establece la ubicación de almacenamiento del registro binlog
binlog_do_db=test Establece la base de datos para sincronización, si esta línea no está escrita, significa que todas las bases de datos están sincronizadas
binlog_ignore_db=mysql Establecer la base de datos para la no sincronización
Recuerde que después de la configuración, hay otro comando que necesita reiniciar el servicio.
3.4 Ver el estado del maestro principal
Después de configurar el archivo de configuración, inicie sesión en el sistema de base de datos mysql para verificar la información principal.
[root@master ~]# !m
mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.32 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 157 | test | mysql | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
¿Por qué necesita verificar esta información, porque debe usarse al configurar la base de datos esclava?
El archivo es el archivo de almacenamiento del contenedor de registro que acabamos de configurar, que se usa para registrar el archivo de registro de la operación mysql.
La posición indica el desplazamiento
Binlog_Do_DB, la base de datos que debe sincronizarse,
Binlog_Ignore_DB, la base de datos que no necesita sincronizarse
En este punto, no continúe operando la primera base de datos maestra para evitar cambiar el desplazamiento.
4. Operar desde esclavo
Aquí debe ir al segundo servidor para operar, y aquí también modificar el nombre de host para aumentar el reconocimiento.
4.1 Modificar temporalmente el nombre de host
[root@localhost ~]# hostname slave22
[root@localhost ~]# bash
[root@slave22 ~]#
4.2 Modificar el archivo de configuración
El servidor esclavo solo necesita escribir la identificación única. server-id=22
El contenido de esta identificación no tiene que ser el mismo que el de arriba. Siempre que no sea el mismo que el número de identificación del anterior, puede configurarlo como no. importa que.
#mysql的配置文件
[root@slave22 ~]# vim /etc/my.cnf
[root@slave22 ~]# sed 4,+1p -n /etc/my.cnf
[mysqld]
server-id=22
[root@slave22 ~]# systemctl restart mysqld
No olvides que necesitas reiniciar el servicio.
4.3 Vincular el servidor maestro principal
[root@slave22 ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.32 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> change master to master_host='192.168.116.166',master_user='slave21',master_password='#slvae21!@3LL',master_log_file='mysql-bin.000001',master_log_pos=157;
Query OK, 0 rows affected, 8 warnings (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 192.168.116.166
Master_User: slave21
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 157
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 326
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 157
Relay_Log_Space: 540
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 21
Master_UUID: 7d57e7f4-c945-11ed-b2a1-000c29b5625a
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
Network_Namespace:
1 row in set, 1 warning (0.00 sec)
La declaración que realmente necesita ser ejecutada;
change master to master_host='192.168.116.166',master_user='slave21',master_password='#slvae21!@3LL',master_log_file='mysql-bin.000001',master_log_pos=157;
- master_host= #La IP del primer maestro principal se debe completar más tarde
- master_user= #escribe el nombre de usuario creado en el maestro principal antes
- master_password= #escriba la contraseña del nombre de usuario creado en el maestro maestro antes
- master_log_file= #Archivo de registro, use mostrar el estado del maestro en el maestro; el valor que se muestra en ese paso.
- master_log_pos= #desplazamiento
start slave;
Habilitar la replicación de datos síncrona
show slave status \G
Después de ejecutar esta declaración, verifique si los dos valores de Slave_IO_Running: Yes y Slave_SQL_Running: Yes son Sí. Si es así, significa que la sincronización está en progreso, lo que también significa que nuestro experimento esta vez es exitoso.
Por supuesto, también hay casos en los que estos dos valores no son sí después de que se terminan los socios pequeños, y puede haber situaciones en las que un valor es no, o ambos valores son no.
4.4 Cómo resolver el problema de no
Puede detener el esclavo primero y redefinirlo nuevamente hasta que ambos sean sí.
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> reset slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.03 sec)
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 192.168.116.166
Master_User: slave21
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 157
Relay_Log_File: localhost-relay-bin.000003
Relay_Log_Pos: 373
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 157
Relay_Log_Space: 767
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 21
Master_UUID: 7d57e7f4-c945-11ed-b2a1-000c29b5625a
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
Network_Namespace:
1 row in set, 1 warning (0.00 sec)
También puede copiar el contenido de la base de datos que se sincronizará con el servidor esclavo primero, de modo que el contenido de la base de datos que sincronizarán los dos servidores sea exactamente el mismo, y luego use este método nuevamente para enlazar e iniciar.
5. Resultados de la prueba
5.1 Crear una base de datos en el maestro maestro
Hemos terminado los experimentos anteriores y es hora de comenzar a crear una base de datos para la verificación. La base de datos que elegimos para sincronizar es entonces test
crearemos test
una base de datos y escribiremos tablas, datos, etc. en ella.
#主master上创建
mysql> create database test;
Query OK, 1 row affected (0.01 sec)
mysql> create database abc;
Query OK, 1 row affected (0.00 sec)
mysql> use test
Database changed
mysql> create table test1(id int,name varchar(20) not null default 'username');
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test1 values(1,'zhangsan'), (2,'lisi'), (3,'wangwu');
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> desc test1;
+-------+-------------+------+-----+----------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+----------+-------+
| id | int | YES | | NULL | |
| name | varchar(20) | NO | | username | |
+-------+-------------+------+-----+----------+-------+
2 rows in set (0.01 sec)
mysql> select id,name from test1;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
+------+----------+
3 rows in set (0.00 sec)
5.2 Vista desde la base de datos en el esclavo
Puede ver que test
la base de datos se ha sincronizado. Ingrese test
a la base de datos para ver los datos debajo de ella, y también está sincronizada.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| test1 |
+----------------+
1 row in set (0.00 sec)
mysql> desc test1;
+-------+-------------+------+-----+----------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+----------+-------+
| id | int | YES | | NULL | |
| name | varchar(20) | NO | | username | |
+-------+-------------+------+-----+----------+-------+
2 rows in set (0.00 sec)
mysql> select id,name from test1;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
+------+----------+
3 rows in set (0.00 sec)
La información de las tablas en la base de datos existe, lo que indica que no hay problema en seleccionar la base de datos para la sincronización test
.
Resumir
Después de hacer el experimento anterior, encontrará que la base de datos principal solo se puede sincronizar desde la base de datos. Entonces, ¿se pueden sincronizar ambos entre sí sobre esta base? La respuesta es sí. Este método es la sincronización principal y principal. Es es el servidor maestro, es el esclavo cuando sincroniza datos y es el maestro cuando escribe datos, lo cual se revelará en el próximo artículo. Si crees que el contenido anterior está bien, ¡puedes darle me gusta y apoyarlo!