MySQL复制是将数据从一个MySQL数据库服务器(主数据库)自动复制到一个或多个MySQL数据库服务器)的过程。 通常用于将读取访问扩展到多个服务器以实现可伸缩性,但也可以用于其他目的,如故障切换和辅助服务器上的数据分析,以避免主服务器过载。
由于主从复制是从主到从的单向复制,因此写入操作可能只使用主数据库,而读取操作可能分布在多个从数据库中。 这意味着,如果使用主从复制作为横向扩展解决方案,则必须至少定义两个数据源。 一个用于写入,另一个用于读取。
MySQL主从复制
MySQL开发人员通常只在一台计算机上运行,他们倾向于将整个开发环境放在该计算机上,在逻辑上与网络和互联网连接无关。 例如,必须在开发环境中测试复制,然后在其他位置部署更改,因此如果需要主从复制,则必须在同一台计算机上创建复制。 虽然设置单个MySQL实例非常简单,但在复制主从机之前,需要额外的努力来设置第二个实例。
在本分步教程中,我们选择了Ubuntu Linux作为主机操作系统,并为该操作系统提供了相应的命令。 如果要在其他操作系统上配置MySQL主从复制,则必须修改该特定命令。 但是,在同一台计算机上设置MySQL主和从复制的一般原则在所有操作系统上是相同的。
MySQL主从复制
安装第一个MySQL实例
如果计算机上已经安装了MySQL数据库实例,则可以跳过此步骤。
在Ubuntu上安装MySQL的最简单方法是在终端提示符下运行以下命令:
sudo apt-get安装MySQL-server
安装过程中,系统会提示您设置MySQL root用户的密码。
配置mysqld_multi
要在同一台计算机上有效管理两个MySQL实例,必须使用mysqld_multi。
的第一步mysqld_multi是[mysqld]在现有my.cnf文件中创建两个单独的组。 my.cnfUbuntu上文件的默认位置为/etc/mysql/。 因此,my.cnf必须使用您喜欢的文本编辑器打开文件,并将现有[mysqld]组重命名为[mysqld1]。 重命名的组将用于配置第一个MySQL实例,也将配置为主实例。 与MySQL主从复制一样,每个实例都必须有自己的服务器- id。 在[mysqld1]组中添加以下行:
服务器id=1
因为[mysqld]的第二个MySQL实例需要另一个组,所以[mysqld1]使用所有当前设置复制组,并将其粘贴到同一my.cnf文件中。 现在,将复制的组重命名为[mysqld2],并在从机配置中进行以下更改:
服务器id=2
端口=3307
socket=/var/run/mysqld/mysqld _ slave.sock
PID-file=/var/run/mysqld/mysqld _ slave.PID
datadir=/var/lib/mysql_slave
log _ error=/var/log/MySQL _ slave/error _ slave.log
relay-log=/var/log/MySQL _ slave/relay-dqdzfj
relay-log-index=/var/log/MySQL _ slave/relay-dqdzfj.index
master-info-file=/var/log/MySQL _ slave/master.info
relay-log-info-file=/var/log/MySQL _ slave/relay-log.info
read_only=1
将server-id设置为2,因为要将第二个MySQL实例设置为从属实例,它必须与主实例的server-id不同。
因为两个实例都在同一台计算机上运行,所以port将第二个实例设置为。 因为3307必须与用于第一个实例的端口3306 (默认情况下为端口)不同。
要在此第二个实例上使用相同的MySQL二进制文件,必须将socket、pid-file、datadir和log_error设置为不同的值。
此外,还必须启用relay-log以使用第二个实例作为奴隶。 参数relay-log、relay-log-index和relay-log-info-file以及集合master-info-file。
最后,将read_only参数设置为1,以使从属实例为只读。 此选项必须谨慎使用,因为无法完全阻止对辅助服务的更改。 即使将read_only设置为1,也只允许具有SUPER权限的用户进行更新。 MySQL最近引入了新参数。 SUPER_read_only防止super用户修改。 版本5.7.8中提供了此选项。
除了[mysqld1]和[mysqld2]组外,还必须添加新组[mysqld_multi]的my。
cnf文件:[mysqld_multi]
mysqld = /usr/dqdzfj/mysqld_safe
mysqladmin = /usr/dqdzfj/mysqladmin
user = multi_admin
password = multipass
一旦安装了第二个MySQL实例,并且都启动了它们,我们将为multi_admin用户提供适当的特权,以便能够关闭MySQL实例。
为第二个MySQL实例创建新文件夹
在上一步中,我们为第二个MySQL实例准备了配置文件。在该配置文件中,使用了两个新文件夹。为了创建具有适当特权的文件夹,应使用以下Linux命令:
mkdir -p /var/lib/mysql_slave
chmod --reference /var/lib/mysql /var/lib/mysql_slave
chown --reference /var/lib/mysql /var/lib/mysql_slave
mkdir -p /var/log/mysql_slave
chmod --reference /var/log/mysql /var/log/mysql_slave
chown --reference /var/log/mysql /var/log/mysql_slave
AppArmor中的其他安全设置
在某些Linux环境中,需要AppArmor安全设置才能运行第二个MySQL实例。至少在Ubuntu上是必需的。
要正确设置AppArmor,请/etc/apparmor.d/usr.sdqdzfj.mysqld使用您喜欢的文本编辑器编辑文件,并添加以下几行:
/var/lib/mysql_slave/ r,
/var/lib/mysql_slave/*rwk,
/var/log/mysql_slave/ r,
/var/log/mysql_slave/ rw,
/var/run/mysqld/mysqld_slave.pid rw,
/var/run/mysqld/mysqld_slave.sock w,
/run/mysqld/mysqld_slave.pid rw,
/run/mysqld/mysqld_slave.sock w,
保存文件后,重新启动计算机,以使这些更改生效。
第二个MySQL实例的安装
可以使用几种不同的方法来安装第二个MySQL实例。本教程中介绍的方法使用与第一个相同的MySQL二进制文件,而第二个安装则需要单独的数据文件。
由于我们已经在前面的步骤中准备了配置文件和必要的文件夹以及安全性更改,因此第二个MySQL实例的最后安装步骤是初始化MySQL数据目录。
执行以下命令以初始化新的MySQL数据目录:
mysql_install_db --user=mysql --datadir=/var/lib/mysql_slave
初始化MySQL数据目录后,您可以使用该mysqld_multi服务启动两个MySQL实例:
mysqld_multi start
root通过使用mysqladmin适当的主机和端口来设置第二个MySQL实例的密码。请记住,如果未指定host和port,mysqladmin默认情况下将连接到第一个MySQL实例:
mysqladmin --host=127.0.0.1 --port=3307 -u root password rootpwd
在上面的示例中,我将密码设置为“ rootpwd”,但是建议使用更安全的密码。
的附加配置 mysqld_multi
在“设置mysqld_multi”部分的结尾,我写道,multi_admin稍后我们将为用户提供适当的特权,因此现在该了。我们需要在两个实例中都赋予该用户适当的特权,所以让我们首先连接到第一个实例:
mysql --host=127.0.0.1 --port=3306 -uroot -p
登录后,执行以下两个命令:
mysql> GRANT SHUTDOWN ON . TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass';
mysql> FLUSH PRIVILEGES;
从MySQL客户端退出,并连接到第二个实例:
mysql --host=127.0.0.1 --port=3307 -uroot -p
登录后,执行与上述相同的两个命令:
mysql> GRANT SHUTDOWN ON . TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass';
mysql> FLUSH PRIVILEGES;
从MySQL客户端退出。
在启动时自动启动两个MySQL实例
设置的最后一步mysqld_multi是在中安装自动启动脚本init.d。
要做到这一点,创建一个名为新文件mysqld_multi中/etc/init.d,并给它适当的权限:
cd /etc/init.d
touch mysqld_multi
chmod +x /etc/init.d/mysqld_multi
使用您喜欢的文本编辑器打开此新文件,然后复制以下脚本:
#!/dqdzfj/sh
BEGIN INIT INFO
Provides: scriptname
Required-Start: $remote_fs $syslog
Required-Stop: $remote_fs $syslog
Default-Start: 2 3 4 5
Default-Stop: 0 1 6
Short-Description: Start daemon at boot time
Description: Enable service provided by daemon.
END INIT INFO
dqdzfjdir=/usr/dqdzfj
if test -x $dqdzfjdir/mysqld_multi
then
mysqld_multi="$dqdzfjdir/mysqld_multi";
else
echo "Can't execute $dqdzfjdir/mysqld_multi";
exit;
fi
case "$1" in
'start' )
"$mysqld_multi" start $2
;;
'stop' )
"$mysqld_multi" stop $2
;;
'report' )
"$mysqld_multi" report $2
;;
'restart' )
"$mysqld_multi" stop $2
"$mysqld_multi" start $2
;;
*)
echo "Usage: $0 {start|stop|report|restart}" >&2
;;
esac
使用以下命令将mysqld_multi服务添加到默认设置runlevels:
update-rc.d mysqld_multi defaults
重新启动计算机,并使用以下命令检查两个MySQL实例是否都在运行:
mysqld_multi report
设置主从复制
现在,当我们在同一台计算机上运行两个MySQL实例时,我们将第一个实例设置为主实例,将第二个实例设置为从实例。
在“设置mysqld_multi”一章中已经执行了配置的一部分。my.cnf文件中唯一剩下的更改是在主数据库上设置二进制日志记录。为此,请my.cnf在[mysqld1]组中进行以下更改和添加的情况下编辑文件:
log_dqdzfj = /var/log/mysql/mysql-dqdzfj.log
innodb_flush_log_at_trx_commit = 1
sync_dqdzfjlog = 1
dqdzfjlog-format = ROW
重新启动MySQL主实例,以使这些更改生效:
mysqld_multi stop 1
mysqld_multi start 1
为了使从属服务器以正确的复制特权连接到主服务器,应在主服务器上创建一个新用户。使用具有适当主机和端口的MySQL客户端连接到主实例:
mysql -uroot -p --host=127.0.0.1 --port=3306
创建一个新用户进行复制:
mysql> CREATE USER 'replication'@'%' IDENTIFIED BY 'replication';
mysql> GRANT REPLICATION SLAVE ON . TO 'replication'@'%';
从MySQL客户端退出。
执行以下命令以创建主数据转储:
mysqldump -uroot -p --host=127.0.0.1 --port=3306 --all-databases --master-data=2 > replicationdump.sql
在这里,我们使用该选项--master-data=2以使注释包含CHANGE MASTER备份文件中的语句。该注释指示备份时的复制坐标,稍后我们将需要这些坐标来更新从属实例中的主信息。这是该评论的示例:
Position to start replication or point-in-time recovery from
CHANGE MASTER TO MASTER_LOG_FILE='mysql-dqdzfj.000001', MASTER_LOG_POS=349;
将您在上一步中创建的转储导入到从属实例中:
mysql -uroot -p --host=127.0.0.1 --port=3307 < replicationdump.sql
最后,为了使从属实例连接到主实例,需要使用适当的连接参数更新有关从属实例的主信息。
使用具有适当主机和端口的MySQL客户端连接到从属实例:
mysql -uroot -p --host=127.0.0.1 --port=3307
执行以下命令以更新主信息(replicationdump.sql如上所述,从转储文件中获取复制坐标):
mysql> CHANGE MASTER TO
-> MASTER_HOST='127.0.0.1',
-> MASTER_USER='replication',
-> MASTER_PASSWORD='replication',
-> MASTER_LOG_FILE='mysql-dqdzfj.000001',
-> MASTER_LOG_POS=349;
执行以下命令以启动从站:
mysql> START SLAVE;
执行以下命令以确认复制已启动并正在运行:
mysql> SHOW SLAVE STATUS G
恭喜你 现在已成功在同一台计算机上设置了MySQL主从复制。
MySQL主从复制
包起来
如果您需要生产环境中的横向扩展解决方案,则在开发环境中配置主从复制非常有用。这样,您还将为读写操作配置了单独的数据源,因此可以在进一步部署之前在本地测试一切正常。
此外,您可能希望在同一台计算机上配置多个从属实例,以测试将读取操作分配给多个从属的负载均衡器。在这种情况下,您可以通过重复所有相同的步骤来使用此手册来设置其他从属实例。