MySQL部署基于二进制日志文件位置的主从复制集群
MySQL主从复制介绍
MySQL 主从复制(Master-Slave Replication) 作为一种经典的数据库复制方案,被广泛应用于企业生产环境,尤其是在提升数据库性能、实现数据备份和分布式扩展方面具有重要作用。
官方文档:https://dev.mysql.com/doc/refman/8.4/en/replication.html
复制功能可将一个 MySQL 数据库服务器(称为源)的数据复制到一个或多个 MySQL 数据库服务器(称为副本)。默认情况下,复制是异步的;副本不需要永久连接就能从源服务器接收更新。根据配置,您可以复制所有数据库、选定的数据库,甚至是数据库中选定的表。
MySQL 复制的优势包括:
- 扩展解决方案–将负载分散到多个副本中以提高性能。在这种环境下,所有写入和更新都必须在源服务器上进行。而读取可以在一个或多个副本上进行。这种模式可以提高写入的性能(因为源服务器专门用于更新),同时显著提高越来越多副本的读取速度。
- 数据安全–由于副本可以暂停复制过程,因此可以在副本上运行备份服务,而不会损坏相应的源数据。
- 分析 - 实时数据可在源上创建,而信息分析可在副本上进行,不会影响源的性能。
- 远距离数据分发–您可以使用复制功能创建一个本地数据副本,供远程站点使用,而无需永久访问源。
MySQL 支持不同的复制方法:
- 传统方法基于从源的二进制日志中复制事件,需要在源和副本之间同步日志文件和其中的位置。
- 基于全局事务标识符(GTID)的新方法是事务性的,因此不需要处理日志文件或这些文件中的位置,从而大大简化了许多常见的复制任务。只要在源上提交的所有事务也应用到了副本上,使用 GTID 的复制就能保证源和副本之间的一致性。
MySQL 中的复制支持不同类型的同步:
- 最初的同步类型是单向异步复制,即一台服务器作为源,一台或多台其他服务器作为副本。这与同步复制形成了鲜明对比,同步复制是 NDB 群集的特征之一。
- 在 MySQL 8.4 中,除了内置的异步复制外,还支持半同步复制。使用半同步复制时,在返回执行事务的会话之前,会先在源块上执行提交,直到至少有一个副本确认收到并记录了事务的事件。
- MySQL 8.4 还支持延迟复制,即副本故意落后源至少一段指定时间。
- 对于需要同步复制的情况,请使用 NDB 群集。
复制格式有两种核心类型:
基于语句的复制(SBR)和基于行的复制(RBR),前者复制整个 SQL 语句,后者只复制已更改的行。您还可以使用第三种复制格式,即混合复制(MBR)。
部署节点规划
以下是一个 MySQL 一主两从的主从复制集群,采用基于二进制日志文件位置的主从复制方案,主从同步类型采用默认的异步复制。
节点规划
节点角色 | 主机名 | IP地址 | 操作系统 |
---|---|---|---|
主库 | mysql-node31 | 192.168.72.31 | Ubuntu22.04 |
从库1 | mysql-node32 | 192.168.72.32 | Ubuntu22.04 |
从库2 | mysql-node33 | 192.168.72.33 | Ubuntu22.04 |
数据目录:/var/lib/mysql
系统用户:mysql
数据库版本:MySQL 8.4.4 LTS
主从复制节点架构如下:
环境准备
每个节点单独配置主机名
hostnamectl set-hostname mysql-node31
hostnamectl set-hostname mysql-node32
hostnamectl set-hostname mysql-node33
每个节点配置hosts解析
MySQL默认会反向解析DNS,对于访问者MySQL不会判断是hosts还是ip都会进行dns反向解析。如果不配置主机名解析,可以通过[mysqld]
下配置skip_name_resolve = 1
禁用,强制使用 IP 地址连接。
cat >/etc/hosts<<EOF
192.168.72.31 mysql-node31
192.168.72.32 mysql-node32
192.168.72.33 mysql-node33
EOF
安装MySQL
使用APT源安装MySQL:https://dev.mysql.com/downloads/repo/apt/
添加MySQL APT仓库
wget https://repo.mysql.com//mysql-apt-config_0.8.33-1_all.deb
dpkg -i mysql-apt-config_0.8.33-1_all.deb
选择第一项:MySQL Server & Cluster (Currently selected: mysql-8.4-lts)
选择mysql-8.4-lts
更新APT仓库
apt update -y
查看可安装的版本
root@mysql-node31:~# apt-cache policy mysql-server
mysql-server:Installed: (none)Candidate: 8.4.4-1ubuntu22.04Version table:8.4.4-1ubuntu22.04 500500 http://repo.mysql.com/apt/ubuntu jammy/mysql-8.4-lts amd64 Packages8.0.41-0ubuntu0.22.04.1 500500 http://mirrors.aliyun.com/ubuntu jammy-updates/main amd64 Packages500 http://mirrors.aliyun.com/ubuntu jammy-security/main amd64 Packages8.0.28-0ubuntu4 500500 http://mirrors.aliyun.com/ubuntu jammy/main amd64 Packages
安装MySQL数据库
apt install -y mysql-server
设置ROOT密码
或者执行apt install命令前通过非交互式设置数据库ROOT密码
sudo debconf-set-selections <<< "mysql-server mysql-server/root_password password Mysql#123456"
sudo debconf-set-selections <<< "mysql-server mysql-server/root_password_again password Mysql#123456"
然后执行
sudo DEBIAN_FRONTEND=noninteractive apt install -y mysql-server
查看安装版本
root@mysql-node31:~# mysql -V
mysql Ver 8.4.4 for Linux on x86_64 (MySQL Community Server - GPL)
查看数据目录
root@mysql-node31:~# ll /var/lib/mysql
total 103512
drwxr-x--- 7 mysql mysql 4096 Jan 16 23:34 ./
drwxr-xr-x 47 root root 4096 Jan 16 23:32 ../
-rw-r----- 1 mysql mysql 56 Jan 16 23:32 auto.cnf
-rw-r----- 1 mysql mysql 505 Jan 16 23:32 binlog.000001
-rw-r----- 1 mysql mysql 181 Jan 16 23:32 binlog.000002
-rw-r----- 1 mysql mysql 158 Jan 16 23:34 binlog.000003
-rw-r----- 1 mysql mysql 48 Jan 16 23:34 binlog.index
-rw------- 1 mysql mysql 1705 Jan 16 23:32 ca-key.pem
-rw-r--r-- 1 mysql mysql 1108 Jan 16 23:32 ca.pem
-rw-r--r-- 1 mysql mysql 1108 Jan 16 23:32 client-cert.pem
-rw------- 1 mysql mysql 1705 Jan 16 23:32 client-key.pem
-rw-r----- 1 mysql mysql 6291456 Jan 16 23:36 '#ib_16384_0.dblwr'
-rw-r----- 1 mysql mysql 14680064 Jan 16 23:32 '#ib_16384_1.dblwr'
-rw-r----- 1 mysql mysql 3439 Jan 16 23:32 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 Jan 16 23:34 ibdata1
-rw-r----- 1 mysql mysql 12582912 Jan 16 23:34 ibtmp1
drwxr-x--- 2 mysql mysql 4096 Jan 16 23:34 '#innodb_redo'/
drwxr-x--- 2 mysql mysql 187 Jan 16 23:34 '#innodb_temp'/
drwxr-x--- 2 mysql mysql 143 Jan 16 23:32 mysql/
-rw-r----- 1 mysql mysql 26214400 Jan 16 23:34 mysql.ibd
-rw-r----- 1 mysql mysql 124 Jan 16 23:32 mysql_upgrade_history
drwxr-x--- 2 mysql mysql 8192 Jan 16 23:32 performance_schema/
-rw------- 1 mysql mysql 1709 Jan 16 23:32 private_key.pem
-rw-r--r-- 1 mysql mysql 452 Jan 16 23:32 public_key.pem
-rw-r--r-- 1 mysql mysql 1108 Jan 16 23:32 server-cert.pem
-rw------- 1 mysql mysql 1705 Jan 16 23:32 server-key.pem
drwxr-x--- 2 mysql mysql 28 Jan 16 23:32 sys/
-rw-r----- 1 mysql mysql 16777216 Jan 16 23:36 undo_001
-rw-r----- 1 mysql mysql 16777216 Jan 16 23:36 undo_002
测试访问数据库
root@mysql-node31:~# mysql -uroot -pMysql#123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.4.4 MySQL Community Server - GPLCopyright (c) 2000, 2025, 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 databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)mysql>
默认已开启binlog
mysql> SHOW VARIABLES LIKE '%log_bin%';
+---------------------------------+-----------------------------+
| Variable_name | Value |
+---------------------------------+-----------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/binlog |
| log_bin_index | /var/lib/mysql/binlog.index |
| log_bin_trust_function_creators | OFF |
| sql_log_bin | ON |
+---------------------------------+-----------------------------+
5 rows in set (0.01 sec)
默认未开启及gtid模式
mysql> SHOW VARIABLES LIKE 'gtid_mode';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| gtid_mode | OFF |
+---------------+-------+
1 row in set (0.01 sec)mysql>
创建复制账号
以下操作在所有节点执行。
备份账号的目的是为了让备份工具(如 mysqldump
或其他工具)能够访问数据库进行备份。备份账号通常被授予只读权限,确保它可以访问数据,但不能修改数据。建议在所有节点(1主2从)上都创建备份账号,原因如下:
- 高可用考虑:如果主库出现故障,从库可能需要提升为新主库,需要保证在切换后仍然可以正常执行备份操作,在所有节点都有备份账号可以避免主从切换后手忙脚乱地创建账号
- 数据验证需求:有时需要对从库做备份来验证数据一致性,从库备份可以降低主库负载,以及用于特殊场景如数据验证、数据迁移等
- 注意事项:权限要统一,避免各节点权限不一致导致问题,密码最好也保持一致,便于管理,建议限制允许连接的IP地址,不要用’%',定期检查账号状态和权限
连接到数据库
mysql -uroot -pMysql#123456
创建专门用于复制的账户,MySQL使用 REPLICATION SLAVE 权限来创建用于复制的用户。
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
检查创建是否成功
mysql> select user,host from mysql.user where User='repl';
+------+------+
| user | host |
+------+------+
| repl | % |
+------+------+
1 row in set (0.00 sec)
检查当前用户获得的授权
mysql> SHOW GRANTS FOR 'repl'@'%';
+----------------------------------------------+
| Grants for repl@% |
+----------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO `repl`@`%` |
+----------------------------------------------+
1 row in set (0.00 sec)
配置mysql-node31
主数据库
查看默认配置
root@mysql-node31:~# cat /etc/mysql/mysql.conf.d/mysqld.cnf | grep -v "^#"[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log
创建主从配置文件
cat >/etc/mysql/conf.d/replication.cnf<<EOF
[mysqld]
# 基础配置
server_id = 31
report-host = mysql-node31
read_only = 0# 二进制日志 (Binlog) 相关
log_bin = /var/lib/mysql/binlog
log_bin_index = /var/lib/mysql/binlog.index
binlog_format = ROW
log_slave_updates = 1
sync_binlog = 1
binlog_cache_size = 1M
binlog_expire_logs_seconds = 604800# 复制 (Replication) 相关
relay_log = /var/lib/mysql/relaylog
relay_log_index = /var/lib/mysql/relaylog.index
skip_slave_start = 0
sync-master-info = 1# InnoDB 相关
innodb_flush_log_at_trx_commit = 1
EOF
配置参数说明:
-
server-id
:设置 MySQL 服务器的唯一标识符,通常用于主从复制环境。主从复制需要每个 MySQL 实例有唯一的server_id
。值可以是整数,取值范围:1 – 2的32次方-1,默认为1 -
report-host:
在主节点的复制日志中报告从节点的主机名或 IP 地址。在多主复制或有多个从节点时,设置此参数可以帮助主节点正确识别从节点的名称。 -
read-only
:0(默认)表示读写(主机),1表示只读(从机),设置 MySQL 实例是否允许写操作。0
表示关闭只读模式,允许写入(通常用于主库)。如果是从库,建议设置为1
,即只读模式(除了复制线程外不允许写入)。 -
log-bin
:二进制日志名,在 MySQL 8.0 及之后的版本中,binlog 默认启用。启用二进制日志,并设置二进制日志文件的路径和前缀。二进制日志用于记录数据更改(例如 INSERT、UPDATE 等)。在主从复制中,主库将通过二进制日志向从库同步数据。
这里的路径 /var/lib/mysql/binlog 是二进制日志文件的存储位置,日志文件会以此为前缀。
-
log_bin_index
:指定用于记录二进制日志文件列表的索引文件路径。该文件存储所有二进制日志文件的名称。MySQL 会通过这个索引文件来管理和定位二进制日志。 -
binlog_format
:设置二进制日志的记录格式。可选值:STATEMENT:记录 SQL 语句。ROW:记录每行数据的变化。MIXED:混合模式。推荐使用 ROW,因为它能更精确地记录数据更改,避免因 SQL 语句依赖上下文而导致的不一致。 -
log_slave_updates:
启用从节点记录其接收到的 binlog。默认情况下,从节点不会记录自己接收到的日志。启用此选项后,从节点会将接收到的事件也记录到自己的 binlog 中,这对于链式复制(即从节点作为其他从节点的主节点)是有用的。 -
sync_binlog
:控制二进制日志的同步频率。1 表示每次提交事务时,将二进制日志同步到磁盘,确保数据的持久性。值越大,性能越高,但可能丢失更多的数据。推荐设置为 1,特别是在需要高数据一致性的场景。 -
binlog_cache_size
:每个会话的二进制日志缓存大小,减少大事务写入临时文件的开销。 -
binlog_expire_logs_seconds
:二进制日志的过期时间(7天),避免日志无限增长而占用磁盘空间。 -
relay_log:
设置从节点的 relay log 文件的存储路径。Relay log 用于记录从主节点接收到的二进制日志事件,从节点执行这些事件来同步数据。 -
relay_log_index:
设置记录 relay log 文件索引的路径。该文件用于跟踪当前使用的 relay log 文件,并帮助从节点在重新启动时继续执行未完成的日志事件。 -
skip_slave_start:
控制 MySQL 是否在启动时自动开始从复制的进程。设置为0
(默认值)表示从节点在启动时会自动启动复制进程。如果设置为1
,则从节点不会自动启动复制进程,必须手动启动。 -
skip_slave_start = 1
: 用于配置 MySQL 复制,默认从服务器在启动时不会自动启动SQL_THREAD
,需要手动执行START SLAVE
来启动复制。 -
innodb_flush_log_at_trx_commit
:控制事务提交时 InnoDB 日志的刷新方式。1 表示每次提交事务时,将日志写入磁盘,提供最高的一致性。值可选:0:日志写入内存,每秒刷新一次到磁盘。1:每次提交事务时刷新到磁盘。2:提交事务时写入内存,每秒刷新到磁盘。推荐设置为 1,确保事务的持久性和一致性。
重新启动主数据库服务
systemctl restart mysql.service
查看数据库服务运行状态
root@mysql-node31:~# systemctl status mysql.service
● mysql.service - MySQL Community ServerLoaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)Active: active (running) since Sat 2025-02-08 14:12:02 CST; 6s agoDocs: man:mysqld(8)http://dev.mysql.com/doc/refman/en/using-systemd.htmlProcess: 4510 ExecStartPre=/usr/share/mysql-8.4/mysql-systemd-start pre (code=exited, status=0/SUCCESS)Main PID: 4550 (mysqld)Status: "Server is operational"Tasks: 35 (limit: 4557)Memory: 428.4MCPU: 1.288sCGroup: /system.slice/mysql.service└─4550 /usr/sbin/mysqldFeb 08 14:12:01 mysql-node31 systemd[1]: Starting MySQL Community Server...
Feb 08 14:12:02 mysql-node31 systemd[1]: Started MySQL Community Server.
获取复制源二进制日志坐标
在主节点上执行。
刷新所有表并阻止写入语句
mysql> FLUSH TABLES WITH READ LOCK;
要配置副本在正确的点开始复制过程,需要在二进制日志中记下源的当前坐标。
mysql> SHOW BINARY LOG STATUS;
示例输出
mysql> SHOW BINARY LOG STATUS;
+---------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+------------------------------------------+
| binlog.000003 | 859 | | | a6045416-e5e7-11ef-ba53-005056aa4e2c:1-3 |
+---------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.01 sec)
解锁表:
mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)mysql> exit;
Bye
参数说明
File
:表示当前正在使用的二进制日志文件名。例如:binlog.000003
表示当前活跃的二进制日志文件是binlog.000003
。Position
:表示二进制日志文件中当前的写入位置(字节偏移量)。例如:1125
表示下一条事务或事件会记录到该文件的偏移位置1125
。Binlog_Do_DB
:指定需要同步的数据库。显示被二进制日志包含(记录) 的数据库列表。如果为空(如上所示),表示没有设置过滤规则,所有数据库的修改都会记录到二进制日志。Binlog_Ignore_DB
: 指定不需要同步的数据库。显示被二进制日志忽略的数据库列表。如果为空,表示没有设置过滤规则,所有数据库的修改都会记录。Executed_Gtid_Set
:表示当前服务器已经执行过的 GTID 集合。例如:75f09330-d097-11ef-bf6e-005056aa349a:1-6
,UUID:75f09330-d097-11ef-bf6e-005056aa349a
是生成这些事务的服务器的 UUID。事务范围:1-6 表示该服务器生成的从事务 1 到事务 6 已经被执行。
记录一下File和Position参数值,在从库配置同步源的时候需要用到。
配置mysql-node32
从数据库
创建主从配置文件,其中仅server_id
、report-host
、read_only
参数与主节点不同。
cat >/etc/mysql/conf.d/replication.cnf<<EOF
[mysqld]
# 基础配置
server_id = 32
report-host = mysql-node32
read_only = 1# 二进制日志 (Binlog) 相关
log_bin = /var/lib/mysql/binlog
log_bin_index = /var/lib/mysql/binlog.index
binlog_format = ROW
log_slave_updates = 1
sync_binlog = 1
binlog_cache_size = 1M
binlog_expire_logs_seconds = 604800# 复制 (Replication) 相关
relay_log = /var/lib/mysql/relaylog
relay_log_index = /var/lib/mysql/relaylog.index
skip_slave_start = 0
sync-master-info = 1# InnoDB 相关
innodb_flush_log_at_trx_commit = 1
EOF
重新启动从库服务:
systemctl restart mysql.service
使用root账号进行连接。
mysql -uroot -pMysql#123456
设置从库的同步源
CHANGE REPLICATION SOURCE TOSOURCE_HOST='192.168.72.31',SOURCE_USER='repl',SOURCE_PASSWORD='password',SOURCE_LOG_FILE='binlog.000003',SOURCE_LOG_POS=859,GET_SOURCE_PUBLIC_KEY=1;
以下是 CHANGE REPLICATION SOURCE TO
命令中每个参数的逐一说明:
SOURCE_HOST
指定主服务器的主机地址或 IP 地址。复制从服务器将连接到该主服务器以获取更新。SOURCE_USER
指定用于连接主服务器的用户名。该用户需要具备主服务器上的REPLICATION SLAVE
权限。SOURCE_PASSWORD
指定与SOURCE_USER
对应的密码,用于从服务器验证连接主服务器的身份。SOURCE_LOG_FILE
指定复制开始的二进制日志文件名。从服务器将从主服务器的这个文件开始读取数据。SOURCE_LOG_POS
指定复制开始的二进制日志文件的字节偏移量(位置)。从服务器从该位置开始读取日志数据。GET_SOURCE_PUBLIC_KEY=1
启用获取主服务器的 RSA 公钥功能。用于在启用了caching_sha2_password
身份验证插件时,从服务器安全地获取主服务器的公钥以建立加密的连接。
开始副本上的复制
mysql> START REPLICA;
在从库上查看复制状态:
mysql> SHOW REPLICA STATUS\G
*************************** 1. row ***************************Replica_IO_State: Waiting for source to send eventSource_Host: 192.168.72.31Source_User: replSource_Port: 3306Connect_Retry: 60Source_Log_File: binlog.000005Read_Source_Log_Pos: 198Relay_Log_File: relaylog.000002Relay_Log_Pos: 325Relay_Source_Log_File: binlog.000005Replica_IO_Running: YesReplica_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Source_Log_Pos: 198Relay_Log_Space: 529Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Source_SSL_Allowed: NoSource_SSL_CA_File: Source_SSL_CA_Path: Source_SSL_Cert: Source_SSL_Cipher: Source_SSL_Key: Seconds_Behind_Source: 0
Source_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Source_Server_Id: 31Source_UUID: 0bc34e5c-d41f-11ef-89eb-005056aa4e2cSource_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLReplica_SQL_Running_State: Replica has read all relay log; waiting for more updatesSource_Retry_Count: 10Source_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Source_SSL_Crl: Source_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: 03cd971d-d41f-11ef-826e-005056aa349a:1-2Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Source_TLS_Version: Source_public_key_path: Get_Source_public_key: 1Network_Namespace:
1 row in set (0.00 sec)
参数说明
Replica_IO_State
:副本的当前状态Replica_IO_Running
:读取源二进制日志的 I/O(接收器)线程是否正在运行。通常情况下为Yes,除非您尚未启动复制或已明确停止复制,否则您希望此线程处于运行状态。Replica_SQL_Running
:执行中继日志中事件的SQL线程是否正在运行。与I/O线程一样,这通常应该是Yes。Last_IO_Error, Last_SQL_Error
:处理中继日志时I/O(接收方)和SQL(应用方)线程记录的最后错误。理想情况下,这些应该是空白的,表示没有错误。Seconds_Behind_Source
:复制SQL(应用程序)线程处理源二进制日志所落后的秒数。数字过大(或不断增加)可能表示副本无法及时处理来自源的事件。值为0,Seconds_Behind_Source通常可以解释为副本已赶上源;但在某些情况下这并不完全正确。例如,如果源和副本之间的网络连接中断,但复制 I/O(接收器)线程尚未注意到这一点,即设置的时间段 replica_net_timeout尚未过去,则可能会发生这种情况。Seconds_Behind_Source无法准确反映情况。当复制 SQL(应用程序)线程赶上 I/O 时, Seconds_Behind_Source显示 0;但当复制 I/O(接收器)线程仍在排队新事件时,Seconds_Behind_Source可能会显示较大的值,直到复制应用程序线程完成执行新事件。当事件具有旧时间戳时尤其可能出现这种情况;在这种情况下,如果您在相对较短的时间内执行SHOW REPLICA STATUS 多次,您可能会看到此值在 0 和相对较大的值之间反复来回变化。
如果要暂停副本上的复制,执行以下命令
mysql> STOP REPLICA;
如果要重置复制,执行以下命令
mysql> RESET REPLICA ALL;
在主节点上查看复制节点信息
mysql> show replicas;
+-----------+--------------+------+-----------+--------------------------------------+
| Server_Id | Host | Port | Source_Id | Replica_UUID |
+-----------+--------------+------+-----------+--------------------------------------+
| 32 | mysql-node32 | 3306 | 31 | c06a6c6d-e5e7-11ef-b5f3-005056aa349a |
+-----------+--------------+------+-----------+--------------------------------------+
1 row in set (0.00 sec)
配置mysql-node33
从数据库
创建主从配置文件,其中仅server_id
、report-host
、read_only
参数与主节点不同。
cat >/etc/mysql/conf.d/replication.cnf<<EOF
[mysqld]
# 基础配置
server_id = 33
report-host = mysql-node33
read_only = 1# 二进制日志 (Binlog) 相关
log_bin = /var/lib/mysql/binlog
log_bin_index = /var/lib/mysql/binlog.index
binlog_format = ROW
log_slave_updates = 1
sync_binlog = 1
binlog_cache_size = 1M
binlog_expire_logs_seconds = 604800# 复制 (Replication) 相关
relay_log = /var/lib/mysql/relaylog
relay_log_index = /var/lib/mysql/relaylog.index
skip_slave_start = 0
sync-master-info = 1# InnoDB 相关
innodb_flush_log_at_trx_commit = 1
EOF
重新启动从库服务:
systemctl restart mysql.service
使用root账号进行连接。
mysql -uroot -pMysql#123456
设置从库的同步源
CHANGE REPLICATION SOURCE TOSOURCE_HOST='192.168.72.31',SOURCE_USER='repl',SOURCE_PASSWORD='password',SOURCE_LOG_FILE='binlog.000003',SOURCE_LOG_POS=859,GET_SOURCE_PUBLIC_KEY=1;
以下是 CHANGE REPLICATION SOURCE TO
命令中每个参数的逐一说明:
SOURCE_HOST
指定主服务器的主机地址或 IP 地址。复制从服务器将连接到该主服务器以获取更新。SOURCE_USER
指定用于连接主服务器的用户名。该用户需要具备主服务器上的REPLICATION SLAVE
权限。SOURCE_PASSWORD
指定与SOURCE_USER
对应的密码,用于从服务器验证连接主服务器的身份。SOURCE_LOG_FILE
指定复制开始的二进制日志文件名。从服务器将从主服务器的这个文件开始读取数据。SOURCE_LOG_POS
指定复制开始的二进制日志文件的字节偏移量(位置)。从服务器从该位置开始读取日志数据。GET_SOURCE_PUBLIC_KEY=1
启用获取主服务器的 RSA 公钥功能。用于在启用了caching_sha2_password
身份验证插件时,从服务器安全地获取主服务器的公钥以建立加密的连接。
开始副本上的复制
mysql> START REPLICA;
在从库上查看复制状态:
mysql> SHOW REPLICA STATUS\G
*************************** 1. row ***************************Replica_IO_State: Waiting for source to send eventSource_Host: 192.168.72.31Source_User: replSource_Port: 3306Connect_Retry: 60Source_Log_File: binlog.000003Read_Source_Log_Pos: 859Relay_Log_File: relaylog.000002Relay_Log_Pos: 325Relay_Source_Log_File: binlog.000003Replica_IO_Running: YesReplica_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Source_Log_Pos: 859Relay_Log_Space: 529Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Source_SSL_Allowed: NoSource_SSL_CA_File: Source_SSL_CA_Path: Source_SSL_Cert: Source_SSL_Cipher: Source_SSL_Key: Seconds_Behind_Source: 0
Source_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Source_Server_Id: 31Source_UUID: a6045416-e5e7-11ef-ba53-005056aa4e2cSource_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLReplica_SQL_Running_State: Replica has read all relay log; waiting for more updatesSource_Retry_Count: 10Source_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Source_SSL_Crl: Source_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Source_TLS_Version: Source_public_key_path: Get_Source_public_key: 1Network_Namespace:
1 row in set (0.00 sec)
在主节点上查看复制节点信息
mysql> show replicas;
+-----------+--------------+------+-----------+--------------------------------------+
| Server_Id | Host | Port | Source_Id | Replica_UUID |
+-----------+--------------+------+-----------+--------------------------------------+
| 33 | mysql-node33 | 3306 | 31 | c2847b99-e5e7-11ef-9c61-005056aa3e12 |
| 32 | mysql-node32 | 3306 | 31 | c06a6c6d-e5e7-11ef-b5f3-005056aa349a |
+-----------+--------------+------+-----------+--------------------------------------+
2 rows in set (0.00 sec)
测试主从复制
创建测试数据库
在设置主从同步之后,在主库上创建一个测试数据库和表,并插入一些测试数据,以验证主从复制是否正常工作。
1. 在主库上创建测试数据库
使用以下命令在主库创建一个名为 test_db
的数据库。
CREATE DATABASE test_db;
2. 切换到新建的数据库
选择 test_db
数据库作为当前数据库。
USE test_db;
3. 创建测试表
创建一个简单的表,例如 test_table
,用于存储测试数据。
CREATE TABLE test_table (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,age INT NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
字段解释:
id
: 主键,自增。name
: 存储字符串类型的名称。age
: 存储整数类型的年龄。created_at
: 记录创建时间,默认值为当前时间。
4. 插入测试数据
向 test_table
表插入一些测试数据。
INSERT INTO test_table (name, age) VALUES
('Alice', 25),
('Bob', 30),
('Charlie', 35);
5. 查看插入的数据
通过查询验证数据是否成功插入。
SELECT * FROM test_table;
期望输出:
+----+---------+-----+---------------------+
| id | name | age | created_at |
+----+---------+-----+---------------------+
| 1 | Alice | 25 | 2025-01-19 16:00:00 |
| 2 | Bob | 30 | 2025-01-19 16:01:00 |
| 3 | Charlie | 35 | 2025-01-19 16:02:00 |
+----+---------+-----+---------------------+
- 在从库验证同步数据
登录从库后,查询表中的数据,检查新插入的数据是否已经同步。
USE test_db;
SELECT * FROM test_table;
从库中查询到的数据应与主库一致:
+----+---------+-----+---------------------+
| id | name | age | created_at |
+----+---------+-----+---------------------+
| 1 | Alice | 25 | 2025-01-19 16:00:00 |
| 2 | Bob | 30 | 2025-01-19 16:01:00 |
| 3 | Charlie | 35 | 2025-01-19 16:02:00 |
+----+---------+-----+---------------------+
- 检查从库同步状态
如果从库数据没有同步或查询不到新数据,使用以下命令检查从库同步状态:
mysql> SHOW REPLICA STATUS\G
重点检查字段:
Slave_IO_Running: Yes
,表示从库 I/O 线程正常运行。Slave_SQL_Running: Yes
,表示从库 SQL 线程正常运行。Seconds_Behind_Master: 0
,表示从库与主库之间没有明显延迟。
相关文章:
MySQL部署基于二进制日志文件位置的主从复制集群
MySQL主从复制介绍 MySQL 主从复制(Master-Slave Replication) 作为一种经典的数据库复制方案,被广泛应用于企业生产环境,尤其是在提升数据库性能、实现数据备份和分布式扩展方面具有重要作用。 官方文档:https://de…...
【系统设计】Spring、SpringMVC 与 Spring Boot 技术选型指南:人群、场景与实战建议
在 Java 开发领域,Spring 生态的技术选型直接影响项目的开发效率、维护成本和长期扩展性。然而,面对 Spring、SpringMVC 和 Spring Boot 这三个紧密关联的框架,开发者常常陷入纠结:该从何入手?如何根据团队能力和业务需…...
【CAPL实战】LIN调度表操作
文章目录 前言1、linChangeSchedTable切换调度表2、linStartScheduler开启调度表3、linStopScheduler停止调度表 前言 在LIN调度表Schedule Table文章中,详细介绍了LIN调度表的信息,那么如何在CAPL脚本测试中进行LIN调度表的操作呢? 1、linC…...
「vue3-element-admin」告别 vite-plugin-svg-icons!用 @unocss/preset-icons 加载本地 SVG 图标
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 …...
[图文]课程讲解片段-Fowler分析模式的剖析和实现01
解说: GJJ-004-1,分析模式高阶Fowler分析模式的剖析和实现,这个课是针对Martin Fowler的《分析模式》那本书里面的模式来讲解,对里面的模式来剖析,然后用代码来实现。 做到这一步的,我们这个是世界上独…...
element-plus el-tree-select 修改 value 字段
element-plus el-tree-select 修改 value 字段 ,不显示label 需要注意两个地方: <el-tree-select v-model"value" :data"data" multiple :render-after-expand"false" show-checkbox style"width: 240px" …...
软件测评实验室CNAS认证能力验证什么时机做?如何查询能力验证相关信息?
能力验证是软件测评实验室申请CNAS认证前必须要做的一类质量活动。CNAS软件测评实验室初次认可和扩大认可范围时,申请认可的每个子领域应至少参加过一次相关领域的能力验证且获得满意结果。通过认定认可后,只要存在可获得的能力验证,不同类目…...
Spring Boot 3.4 中 MockMvcTester 的新特性解析
引言 在 Spring Boot 3.4 版本中,引入了一个全新的 MockMvcTester 类,使 MockMvc 测试可以直接支持 AssertJ 断言。本文将深入探讨这一新特性,分析它如何优化 MockMvc 测试并提升测试的可读性。 Spring MVC 示例 为了演示 MockMvcTester 的…...
网安加·百家讲坛 | 刘志诚:以业务为中心的网络安全挑战与机遇
作者简介:刘志诚,乐信集团信息安全中心总监、OWASP广东区域负责人、网安加社区特聘专家。专注于企业数字化过程中网络空间安全风险治理,对大数据、人工智能、区块链等新技术在金融风险治理领域的应用,以及新技术带来的技术风险治理…...
配置 VS Code 调试 ROS Python 脚本:完整步骤
在 Ubuntu 系统上使用 ROS 和 VS Code 进行 Python 开发时,可能会遇到一些环境配置的问题,特别是当需要加载 ROS 环境变量以及确保正确使用 Python 3 环境时。以下是如何配置 launch.json 和 tasks.json 来确保 VS Code 调试环境能够正确加载 ROS 和 Pyt…...
HTTP4种方法(GET、POST、 PUT和DELETE)
一、GET 和 POST 1. GET方法 特点: 用途:用于从服务器获取数据。 参数传递方式:参数会附加在URL后面,以 keyvalue的形式,通过查询字符串传递,例如: http://example.com/page?nameJohn&…...
AnythingLLM开发者接口API测试
《Win10OllamaAnythingLLMDeepSeek构建本地多人访问知识库》见上一篇文章,本文在上篇基础上进行。 1.生成本地API 密钥 2.打开API测试页面(http://localhost:3001/api/docs/) 就可以在页面测试API了 2.测试获取用户接口(/v1/admin/users) 3…...
CSS定位简介
目录 一、静态定位(Static Positioning) 二、相对定位(Relative Positioning) 三、绝对定位(Absolute Positioning) 四、固定定位(Fixed Positioning) 五、黏性定位(…...
CentOS服务器部署Docker+Jenkins持续集成环境
一、准备工作 一台运行 CentOS 的服务器,确保有足够的磁盘空间、内存资源,并且网络连接稳定。建议使用 CentOS 7 或更高版本,本文以 CentOS 7 为例进行讲解。 拥有服务器的 root 权限,因为后续安装软件包、配置环境等操作需要较…...
React受控组件的核心原理与实战精要
在 React 中,受控组件(Controlled Component) 是一种重要的模式,用于通过组件的状态来管理表单元素的值。这种模式不仅确保了数据的一致性和可预测性,还便于与其他功能(如验证和格式化)集成。本…...
基于python多线程多进程爬虫的maa作业站技能使用分析
基于python多线程多进程爬虫的maa作业站技能使用分析 技能使用分析 多线程(8核) import json import multiprocessing import requests from multiprocessing.dummy import Pooldef maa(st):url "https://prts.maa.plus/copilot/get/"m …...
Android studio怎么创建assets目录
在Android Studio中创建assets文件夹是一个简单的步骤,通常用于存储不需要编译的资源文件,如文本文件、图片、音频等 main文件夹,邮件new->folder-assets folder...
解锁 DeepSeek 模型高效部署密码:蓝耘平台全解析
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
【Spring相关知识】Spring应用如何优雅使用消息队列
文章目录 概述**核心概念****使用场景****快速入门**1. 添加依赖2. 配置 Binder3. 定义消息通道4. 发送和接收消息5. 运行应用 **高级特性****优点****适用场景** 概述 Spring Cloud Stream 是一个用于构建消息驱动微服务的框架,它基于 Spring Boot 和 Spring Inte…...
2025牛客寒假算法基础集训营4(补题)
C Tokitsukaze and Balance String (hard) 一道规律题。赛时以为是难的算法题,就没去碰了,实际上把几种情况列出来后可能就会发现,只有首尾相同的字符串才是平衡的。 首先我们容易发现,连续的1或者0是多余的,因为他们…...
.net一些知识点5
1.dot Net带out的参数如何使用 string name;//假设这个参数带out TestMethod(1,out name);//一定要有out 方法体中,一定要有out参数的赋值,并且能输出 2.参数的传递方式有哪些 a.值传递 b.引用传递 ref c.输出传递 out 3.设计模式知道哪些 3.us…...
基于Servlet简易学生信息管理系统
本次设计的学生信息管理系统,能提供以下功能: (1) 输入入学生信息并保存 (2) 显示所有学生信息 (3) 查询学生信息 (4) 修改学生信息并保存 (…...
IDEA编写SpringBoot项目时使用Lombok报错“找不到符号”的原因和解决
目录 概述|背景 报错解析 解决方法 IDEA配置解决 Pom配置插件解决 概述|背景 报错发生背景:在SpringBoot项目中引入Lombok依赖并使用后出现"找不到符号"的问题。 本文讨论在上述背景下发生的报错原因和解决办法,如果仅为了解决BUG不论原…...
JVM图文入门
往期推荐 【已解决】redisCache注解失效,没写cacheConfig_com.howbuy.cachemanagement.client.redisclient#incr-CSDN博客 【已解决】OSS配置问题_keyuewenhua.oss-cn-beijing.aliyuncs-CSDN博客 【排坑】云服务器docker部署前后端分离项目域名解析OSS-CSDN博客 微服…...
【算法】动态规划专题⑨ —— 二维费用背包问题 python
目录 前置知识进入正题实战演练 前置知识 【算法】动态规划专题⑤ —— 0-1背包问题 滚动数组优化 python 进入正题 二维费用背包问题 方法思路 二维费用背包问题在传统背包问题的基础上增加了第二个维度的限制(如重量)。 每个物品具有两种费用&#x…...
链表专题-02
链表专题 /*** 链表的节点* param <E>*/ public class ListNode<E> {public E element;public ListNode<E> next;public ListNode() {}public ListNode(E element) {this.element element;}public ListNode(E element, ListNode<E> next) {this.eleme…...
亚远景-精通ASPICE:专业咨询助力汽车软件开发高效合规
在竞争日益激烈的汽车行业,软件开发已成为决定成败的关键因素。ASPICE(汽车软件过程改进和能力确定) 作为行业公认的软件开发框架,为汽车制造商和供应商提供了实现高效、合规开发的路线图。 然而,ASPICE 的实施并非易…...
HALCON 数据结构
目录 1. HALCON基本数据分类 1.1 图像相关数据 1.1.1 Image(图片) 1.1.2 Region(区域) 1.1.3 XLD(轮廓) 1.2 控制类数据 1.2.1 基本控制数据类型 1.2.2 handle(句柄) 2. 数组与字典 2.1 数组类型及特点 2.1.1 Iconic数组(Objects) 2.1.2 Control数组(Tu…...
动手写ORM框架 - GeeORM第一天 database/sql 基础
文章目录 1 初识 SQLite2 database/sql 标准库3 实现一个简单的 log 库4 核心结构 Session本文是7天用Go从零实现ORM框架GeeORM的第一篇。介绍了 SQLite 的基础操作(连接数据库,创建表、增删记录等)。使用 Go 语言标准库 database/sql 连接并操作 SQLite 数据库,并简单封装…...
ubuntu conda运行kivy时报“No matching FB config found”
错误描述:本人使用ubuntu自带的python环境运行kivy是没有问题的,就是在使用conda时发生了错误,去网上寻找报错原因,却一直没有头绪(这个问题有诸多问题导致的,不敢说用我的这个方法100%能好) 1…...
SSM开发(十一) mybatis关联关系多表查询(嵌套查询,举例说明)
目录 一、背景介绍 二、一对一查询(嵌套查询) 三、一对多查询(嵌套查询) 四、嵌套查询效率评估 注:关联查询则是指在一个查询中涉及到多个表的联合查询 一、背景介绍 当对数据库的操作涉及到多张表,这在面向对象语言如Java中就涉及到了对象与对象之间的关联关系。针对多…...
【AIGC】冷启动数据与多阶段训练在 DeepSeek 中的作用
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯冷启动数据的作用冷启动数据设计 💯多阶段训练的作用阶段 1:冷启动微调阶段 2:推理导向强化学习(RL࿰…...
Spring(26) spring-security-oauth2 官方表结构解析
目录 一、什么是 spring-security-oauth2?二、spring-security-oauth2 的表结构2.1 oauth_client_details 客户端详细信息表2.2 oauth_access_token 认证授权Token记录表2.3 oauth_refresh_token 刷新授权Token记录表2.4 oauth_code 授权Code记录表 一、什么是 spri…...
WPS如何接入DeepSeek(通过JS宏调用)
WPS如何接入DeepSeek 一、文本扩写二、校对三、翻译 本文介绍如何通过 WPS JS宏调用 DeepSeek 大模型,实现自动化文本扩写、校对和翻译等功能。 一、文本扩写 1、随便打开一个word文档,点击工具栏“工具”。 2、点击“开发工具”。 3、点击“查看代码”…...
项目的虚拟环境的搭建与pytorch依赖的下载
文章目录 配置环境 pytorch的使用需要安装对应的cuda 在PyTorch中使用CUDA, pytorch与cuda不同版本对应安装指南,查看CUDA版本,安装对应版本pytorch 【超详细教程】2024最新Pytorch安装教程(同时讲解安装CPU和GPU版本) 配置环境…...
[每周一更]-(第133期):Go中MapReduce架构思想的使用场景
文章目录 **MapReduce 工作流程**Go 中使用 MapReduce 的实现方式:**Go MapReduce 的特点****哪些场景适合使用 MapReduce?**使用场景1. 数据聚合2. 数据过滤3. 数据排序4. 数据转换5. 数据去重6. 数据分组7. 数据统计8.**统计文本中单词出现次数****代码…...
C 移位运算符
宏定义 #define GET_BIT(n) ((1 << (n))) 用于生成一个整数,该整数在第 n 位上是 1,其余位都是 0。这个宏通常用于位操作,比如设置、清除或检查某个特定位置的标志位。 1 << (n):这是位移操作符。它将数字 1 左移 n …...
redis高级数据结构布隆过滤器
文章目录 背景什么是布隆过滤器Redis 中的布隆过滤器布隆过滤器使用注意事项实现原理空间占用估计 背景 我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容。问题来了,新闻…...
活动预告 |【Part1】Microsoft 安全在线技术公开课:安全性、合规性和身份基础知识
课程介绍 通过参加“Microsoft 安全在线技术公开课:安全性、合规性和身份基础知识”活动提升你的技能。在本次免费的介绍性活动中,你将获得所需的安全技能和培训,以创造影响力并利用机会推动职业发展。你将了解安全性、合规性和身份的基础知识…...
基于DeepSeek模型的思维导图智能系统
基于DeepSeek模型的思维导图智能系统 摘 要:本文研究了Prompt技术在自然语言处理(NLP)中的应用,重点探讨了其在用户输入语言转换任务中的作用。基于DeepSeek模型,文章通过设计不同的Prompt并结合API调用,…...
【玩转 Postman 接口测试与开发2_019】第15章:利用 Postman 初探 API 性能测试(含实战截图)
《API Testing and Development with Postman》最新第二版封面 文章目录 第十五章 API 接口性能测试1 性能负载的类型2 Postman 负载配置3 Postman 性能测试实战3.1 Fixed 型负载下的性能测试3.2 基于数据驱动的 Postman 接口性能测试 4 性能测试的注意事项 写在前面 终于来到了…...
使用 Three.js 实现炫酷的除夕烟花特效
1,前言 在除夕夜,璀璨的烟花点亮夜空,为节日增添了浓厚的喜庆氛围。在 Web 端,我们可以使用 Three.js 来模拟这种美轮美奂的烟花特效,让网页也能展现绚丽的节日气息。本文将介绍如何利用 Three.js 及其着色器技术&…...
【Redis keys命令有什么问题?】
Redis keys命令有什么问题? 性能问题实际使用中的限制替代方案示例讲解Redis keys命令的问题示例替代方案:使用SCAN命令Java代码示例性能问题 时间复杂度:keys命令的时间复杂度是O(n),其中n是Redis中键的总数。这意味着,当Redis中存储的键数量非常大时,执行keys命令会遍历…...
STC51案例操作
案例 1:LED 闪烁 功能描述:通过操作 P1 口寄存器,让连接在 P1.0 引脚的 LED 以一定间隔闪烁。 #include <reg51.h>// 延时函数 void delay(unsigned int time) {unsigned int i, j;for (i 0; i < time; i)for (j 0; j < 123; …...
顺丰数据分析(数据挖掘)面试题及参考答案
你觉得数据分析人员必备的技能有哪些? 数据分析人员需具备多方面技能,以应对复杂的数据处理与解读工作。 数据处理能力:这是基础且关键的技能。数据常以杂乱、不完整的形式存在,需通过清洗,去除重复、错误及缺失值数据,确保数据质量。例如,在电商销售数据中,可能存在价…...
【信息系统项目管理师-案例真题】2016下半年案例分析答案和详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一【问题1】4 分【问题2】12 分【问题3】3 分【问题4】6 分试题二【问题1】3 分【问题2】4 分【问题3】8 分【问题4】5 分【问题5】5 分试题三【问题1】4 分【问题2】8 分【问题3】5 分【问题4】8 分试题一…...
前端学习-页面尺寸事件以及阻止默认行为(三十三)
目录 前言 页面尺寸事件 语法 检测屏幕宽度 获取宽高 元素尺寸的位置 总结 示例代码 阻止默认行为 阻止冒泡 语法 阻止冒泡如何做 阻止元素默认行为如何做 总结 前言 晚上好各位 页面尺寸事件 会在窗口尺寸改变的时候触发条件 语法 window.addEventListener(…...
人工智能领域-CNN 卷积神经网络 性能调优
在自动驾驶领域,对卷积神经网络(CNN)进行性能调优至关重要,以下从数据处理、模型架构、训练过程、超参数调整和模型部署优化等多个方面为你详细介绍调优方法,并给出相应的代码示例。 1. 数据处理 数据增强࿱…...
STM32的HAL库开发---高级定时器---输出比较模式实验
一、高级定时器输出比较模式实验原理 定时器的输出比较模式总共有8种,本文使用其中的翻转模式,当TIMXCCR1TIMXCNT时,翻转OC1REF的电平,OC1REF为输出参考信号,高电平有效,OC1REF信号连接到0C1上面ÿ…...
DeepSeek使用技巧大全(含本地部署教程)
在人工智能技术日新月异的今天,DeepSeek 作为一款极具创新性和实用性的 AI,在众多同类产品中崭露头角,凭借其卓越的性能和丰富的功能,吸引了大量用户的关注。 DeepSeek 是一款由国内顶尖团队研发的人工智能,它基于先进…...