- 转到 Program Data >> MySQL
复制 MYSQL 文件夹,然后将其粘贴到相同位置。
将文件夹重命名为 MySQLSlave。 - 进入 MySQLSlave 文件夹后,将 my.ini 文件重命名为 slave.ini。
- 清空 MySQLSlave 文件夹中的 Data 文件夹中的所有内容。
- 通过清空
MySQLSlave
目录内的Data
文件夹中的所有内容,您可以移除任何先前的配置、日志文件或数据库文件,确保 MySQLSlave 服务器从头开始运行。
命令解析:以管理员身份打开终端或PowerShell。
运行以下命令(以你的目录结构为准):
& “C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld” — initialize-insecure — datadir=”C:\ProgramData\MySQL\MySQLSlave\Data” — console根据你的实际情况修改上述命令中的路径。
& "C:\程序文件\MySQL\MySQL Server 8.0\bin\mysqld"
-
这启动或运行位于位置
C:\Program Files\MySQL\MySQL Server 8.0\bin\
的 MySQL 服务器可执行文件 (mysqld
)。根据你的系统中 MySQL 的安装位置调整此位置。 -
--initialize-insecure
-
不安全初始化:此标志使 MySQL 初始化数据库但不创建 root 密码。它创建了一个无密码的 MySQL 安装,其中 root 用户没有设置密码。
- 另外一种方法:如果你想让 MySQL 生成一个临时 root 密码(该密码将存储在日志中),你可以使用
--initialize
。
--datadir="C:\ProgramData\MySQL\MySQLSlave\Data"
- 数据目录的位置:这指定了 MySQL 应该初始化数据目录的位置。在这种情况下,数据目录设置为
C:\ProgramData\MySQL\MySQLSlave\Data
。MySQL 将在此目录中创建系统表、日志以及其他运行 MySQL 实例所必需的文件。 - 如果我们要设置一个 从属服务器,你稍后可以使用此目录来存储复制日志,以及实际的复制数据库数据。
--命令行
- 控制台输出选项:这会让 MySQL 直接在控制台输出日志,而不是保存到日志文件中。这有助于调试,因为可以直接在终端中查看状态和可能出现的错误。
4. 将 slave.ini 文件的内容进行修改
确保你的端口设置为3307(不同于主库的端口)
服务器ID为2(不同于主服务器)
[mysqld] # [mysqld] 是MySQL服务器的配置部分
port=3307
datadir = C:\ProgramData\MySQL\MySQLSlave\Data
server-id=2
bind-address = 127.0.0.1
mysqlx-bind-address = 127.0.0.1
require_secure_transport = OFF
gtid_mode=ON
enforce-gtid-consistency=ON
log_bin = mysql-bin
read_only = 1
replicate-rewrite-db = master_db->slave_db # 将master_db重写为slave_db
replicate-do-db=slave_db # 仅复制slave_db数据库
replicate-rewrite-db = 从主数据库复制并重写到从数据库,
使用案例: 这意味着当主服务器在 master_db 数据库上执行查询时,实际上是在从服务器的 slave_db 数据库上执行查询。
情况: 非常适用于主数据库和从数据库名称不同的情况。
replicate-do-db = 从库数据库
在 MySQL 的复制过程中,replicate-do-db
选项用于指定哪些数据库需要从主库复制到从库。这个选项很有用,特别是当你只想复制某些特定的数据库时,而不是复制所有数据库。假设您有一个 MySQL 主库,其中包含多个数据库如:db1
,db2
,db3
和 slave_db
。您只想复制 slave_db
数据库到从库,而不复制其他数据库。
**datadir = C:\ProgramData\MySQL\MySQLSlave\Data # 数据目录**
- 这定义了 MySQL 存储数据库和日志文件的数据目录。这里的路径可能是为了 MySQL 的从机服务器设定的,意味着这个实例会在这里存放与复制相关的信息。
require_secure_transport = 关闭状态
- 此设置控制 MySQL 是否需要使用加密连接(SSL/TLS)。当
require_secure_transport
为OFF
时,它允许安全(SSL/TLS)和非安全连接。这在开发环境中通常设置为OFF
,而在生产环境中,建议将其设置为ON
以强制使用加密连接。
**只读模式为1**
- 这会让服务器进入只读模式,意味着服务器(这种情况下的服务器通常是复制设置中的一个从服务器)将仅允许读取操作。写入操作,比如插入、更新或删除,将被限制,除了拥有超级权限的用户。这样做通常是为了防止从服务器上意外更改从主服务器复制的数据。
服务器运行在3307端口,并将数据存储在指定的目录中。
在复制设置中,它具有唯一的服务器ID(2),并且为了安全起见,将标准协议和MySQL X协议都绑定到了本地主机。
启用了基于GTID的复制,确保事务在全球范围内进行跟踪,便于复制管理。
启用了二进制日志记录,以方便复制过程。
服务器已被设置为只读,这是从属服务器(也就是slave服务器)的典型设置,确保它只能读取从主服务器复制的数据。
5. 启动从站。
打开命令提示符或 PowerShell 并以管理员身份运行。
运行以下命令:
"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld" --defaults-file="C:\ProgramData\MySQL\MySQLSlave\slave.ini" --console
根据您的实际目录结构修改上述命令。
6. 设置从节点以连接到特定主节点。
请在从服务器上运行以下命令来定义与主服务器通信并获取复制数据所需的连接参数。
将复制源更改为
SOURCE_HOST = 'localhost',
SOURCE_USER = '用户名',
SOURCE_PASSWORD = '密码',
SOURCE_PORT = '端口号',
SOURCE_AUTO_POSITION = '自动位置',
SOURCE_SSL = 'SSL加密';
(Note: The semicolon at the end is retained as it is part of the original command structure, although it is mentioned to not be used in Chinese technical documentation. However, considering it's a direct translation and for consistency with the source, it's included.)
每个参数的解释如下
1. SOURCE_HOST = ‘localhost’ (SOURCE_HOST = ‘localhost’,这里的 SOURCE_HOST 表示源服务器)- 用途:指定主服务器(或源服务器)的主机名或IP地址,从属服务器将从中复制数据。
- 在这种情况下:
localhost
表示主服务器和从属服务器都在同一台机器上运行,并将复制本地MySQL实例中的数据。 - 替代方案:如果主服务器在远程机器上运行,需要把
localhost
替换成主服务器的IP地址或主机名(例如,SOURCE_HOST = '192.168.1.100'
)。
- 目的:定义从库用来连接主服务器的 MySQL 用户账户。
- 在这种情况下:主服务器(即源服务器)上设置了用户
gaurav_1
,并赋予其复制权限(特别是REPLICATION SLAVE
权限),以便从库可以从主服务器那里获取 binlog 数据。
管理员可以这样创建一个用户账号:
CREATE USER 'gaurav_1'@'localhost' IDENTIFIED BY 'password'; -- 设置用户gaurav_1的密码为'password'
GRANT ALL PRIVILEGES ON *.* TO 'gaurav_1'@'localhost' WITH GRANT OPTION; -- 将所有权限授予用户gaurav_1,允许其进一步授权
FLUSH PRIVILEGES; -- 刷新权限设置
3. SOURCE_PASSWORD = ‘password’
- 目的:对应于
SOURCE_USER
的密码。此密码用于从服务器连接到主服务器时的身份验证。 - 例如:从服务器登录主服务器为
gaurav_1
时使用密码'password'
。
- 这里的意思是:指定主(源)MySQL服务器监听连接请求的端口。
- 在这个例子中:
3306
是 MySQL 的默认端口(也就是通常情况下使用的端口)。如果主服务器使用了不同的端口(比如3307
),你应该相应地修改这个值。
-
- 目的:使从服务器能够使用基于GTID(全局事务ID)的复制,而不是传统的基于二进制日志位置的复制。
-
- 在这种设置下:
SOURCE_AUTO_POSITION = 1
使从服务器自动跟踪主服务器的GTID(而不是手动跟踪特定的日志文件和位置)。GTID确保每个事务都有唯一的标识,从服务器在发生故障后可以自动恢复复制,而无需手动调整日志文件和位置。
- 在这种设置下:
要求:
- 主库和从库都必须开启
gtid_mode=ON
和enforce_gtid_consistency=ON
。
- 作用:控制从库和主库之间的连接是否使用SSL(安全套接层)。
- 在这种设定下:
SOURCE_SSL = 0
禁用SSL,这意味着从库与主库之间传输的复制数据将不会被加密。 - 如果需要使用SSL(例如,为了在不可信网络中安全地传输数据),你可以设置:
SOURCE_SSL = 1;
现在运行此查询。
将复制源修改为
源主机 = 'localhost',
源用户 = 'gaurav_1',
源密码 = 'password',
源端口 = 3306,
源自动位置(启用) = 1,
源SSL = 0; // 关闭SSL加密
7. 现在运行 START SLAVE 命令.
MySQL 中的 START SLAVE
查询用于启动从服务器上的复制。执行后,它会指示从服务器开始与主服务器(即源服务器)连接,并开始复制主服务器的二进制日志(binlogs)到从服务器。
SHOW SLAVE STATUS;
显示从属状态(SHOW SLAVE STATUS);
此命令提供有关复制情况的详细报告,具体包括如下信息:
- 是否正在运行 I/O 和 SQL 线程。
- 当前二进制日志的位置。
- 复制过程中可能出现的任何错误。
- Slave_IO_Running : 表示 I/O 线程是否在运行。如果 I/O 线程正在从主服务器获取数据,则应显示为
Yes
。 - Slave_SQL_Running : 表示 SQL 线程是否在运行。如果 SQL 线程正在将中继日志中的更改应用到从数据库,则应显示为
Yes
。 - Seconds_Behind_Master : 显示从服务器相对于主服务器的滞后时间(以秒为单位)。理想情况下,当从服务器与主服务器完全同步时,这个值应为
0
。 - Last_SQL_Error 和 Last_IO_Error : 显示 SQL 或 I/O 线程记录的最新错误,这有助于解决复制过程中的问题。
如果你需要在任何原因下(比如维护)停止复制操作,可以执行 STOP SLAVE
命令。
停止从库。
创建如下步骤以在主上创建表并确保它能被复制到从:
- 在主服务器上创建表
使用数据库 master_database;
创建表名为 your_table_name (
id INT 自增主键 PRIMARY KEY,
column_name1 数据类型,
column_name2 数据类型
);
2. 确认主服务器上已经创建了表:
显示表; -- SHOW TABLES;
3. 检查从库的状态: 在从库上运行如下命令:
SHOW SLAVE STATUS; -- 显示从属状态
4. 检查备库中的表
使用 slave_database 数据库;
显示表;
5. 现在在主服务器上插入数据,数据将会被复制到从服务器上。
在 master_gaurav
数据库中使用:
创建一个名为 test_table
的表,该表包含两个字段:id
(整数类型,主键)和 name
(字符串类型,最大长度为100)。然后,向 test_table
表中插入一行数据,其中 id
为 1,name
为 'Gaurav'。
MySQL中的主从复制功能,允许你将数据从一个主服务器复制到一个或多个从服务器。这种复制确保任何对主服务器的更改都会实时反映在从服务器上,提供了负载均衡、备份和数据冗余的稳健方案。
在这个配置中,主节点处理写操作(INSERT、UPDATE、DELETE),而从节点复制这些更改,使得读操作可以使用这些更改。这种分离使得主节点可以专注于处理写操作,而从节点则负责处理读取任务,从而提升整个系统的性能。
复制可以使用二进制日志来配置,在这种方式下,主服务器记录所有更改,从服务器读取并执行这些更改。基于GTID(全局事务ID)的复制进一步简化了这一过程,使其更容易跨多个服务器跟踪和管理事务。