在现代企业中,数据显得尤为重要,而存储数据的数据库选择又五花八门,但无论是何种数据库,均存在着一种隐患。
想几个问题:
主从复制步骤:
主从复制配置步骤:
需求:
搭建两台MySQL
服务器,一台作为主服务器,一台作为从服务器,主服务器进行写操作,从服务器进行读操作
环境说明:
数据库角色 | IP | 应用与系统版本 | 有无数据 |
---|---|---|---|
主数据库 | 172.16.12.128 | centos8/redhat8 mysql-5.7 | 有数据 |
从数据库 | 172.16.12.129 | centos8/redhat8 mysql-5.7 | 无数据 |
分别在主从两台服务器上安装mysql-5.7
版本,此处略过安装步骤,若有疑问请参考《mysql基础》与《mysql进阶》两篇文章。
为确保从数据库与主数据库里的数据一样,先全备主数据库并还原到从数据库中
//先查看主库有哪些库 [root@localhost ~]# mysql -uroot -pruntime123! -e 'show databases;' mysql: [Warning] Using a password on the command line interface can be insecure. +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | student | | sys | | teacher | +--------------------+ //再查看从库有哪些库 [root@localhost ~]# mysql -uroot -pruntime123! -e 'show databases;' mysql: [Warning] Using a password on the command line interface can be insecure. +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ //全备主库 mysql> FLUSH TABLES WITH READ LOCK; Query OK, 0 rows affected (0.00 sec) //备份主库并将备份文件传送到从库 [root@localhost ~]# mysqldump -uroot -pruntime123! --all-databases > /opt/all-201808191200.sql mysqldump: [Warning] Using a password on the command line interface can be insecure. [root@localhost ~]# ls /opt/ all-201808191200.sql [root@localhost ~]# scp /opt/all-201808191200.sql root@172.16.12.129:/opt/ root@172.16.12.129's password: all-201808191200.sql 100% 786KB 10.6MB/s 00:00 //解除主库的锁表状态,直接退出交互式界面即可 mysql> quit Bye //在从库上恢复主库的备份并查看从库有哪些库,确保与主库一致 [root@localhost ~]# mysql -uroot -pruntime123! < /opt/all-201808191200.sql mysql: [Warning] Using a password on the command line interface can be insecure. [root@localhost ~]# mysql -uroot -pruntime123! -e 'show databases;' mysql: [Warning] Using a password on the command line interface can be insecure. +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | student | | sys | | teacher | +--------------------+
mysql> CREATE USER 'repl'@'172.16.12.129' IDENTIFIED BY 'repl123'; Query OK, 0 rows affected (0.00 sec) mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.16.12.129'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)
[root@localhost ~]# vim /etc/my.cnf //在[mysqld]这段的后面加上如下内容 [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-bin=mysql-bin //启用binlog日志 server-id=1 //数据库服务器唯一标识符,主库的server-id值必须比从库的大 symbolic-links=0 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid //重启mysql服务 [root@localhost ~]# systemctl restart mysqld [root@localhost ~]# ss -antl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 80 :::3306 :::* //查看主库的状态 mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 154 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.01 sec)
[root@localhost ~]# vim /etc/my.cnf //添加如下内容 [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock server-id=2 //设置从库的唯一标识符,从库的server-id值必须小于主库的该值 relay-log=mysql-relay-bin //启用中继日志relay-log symbolic-links=0 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid //重启从库的mysql服务 [root@localhost ~]# systemctl restart mysqld [root@localhost ~]# ss -antl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 80 :::3306 :::* //配置并启动主从复制 mysql> CHANGE MASTER TO -> MASTER_HOST='172.16.12.128', -> MASTER_USER='repl', -> MASTER_PASSWORD='repl123', -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=154; Query OK, 0 rows affected, 2 warnings (0.33 sec) mysql> start slave; Query OK, 0 rows affected (0.01 sec) //查看从服务器状态 mysql> show slave status \G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.16.12.128 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 154 Relay_Log_File: mysql-relay-bin.000002 Relay_Log_Pos: 320 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes //此处必须为Yes Slave_SQL_Running: Yes //此处必须为Yes Replicate_Do_DB: Replicate_Ignore_DB:
在主服务器的student库的bj2表中插入数据:
mysql> select * from bj2; Empty set (0.00 sec) mysql> insert into bj2 values (1,'sean',20),(2,'tom',23),(3,'jerry',30); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from bj2; +----+-------+------+ | id | name | age | +----+-------+------+ | 1 | sean | 20 | | 2 | tom | 23 | | 3 | jerry | 30 | +----+-------+------+ 3 rows in set (0.00 sec)
在从数据库中查看数据是否同步:
mysql> use student; 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> select * from bj2; +----+-------+------+ | id | name | age | +----+-------+------+ | 1 | sean | 20 | | 2 | tom | 23 | | 3 | jerry | 30 | +----+-------+------+ 3 rows in set (0.00 sec)
用户和组并解压下本地配置程序至/usr/
//创建用户和组 [root@localhost src]# groupadd -r mysql [root@localhost src]# useradd -M -s /sbin/nologin -g mysql mysql //解压软件至/usr/local/ [root@localhost src]# ls debug kernels mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz [root@localhost src]# tar xf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz -C /usr/local/ [root@localhost ~]# ls /usr/local/ bin games lib libexec sbin src etc include lib64 mysql-5.7.22-linux-glibc2.12-x86_64 share [root@localhost ~]# cd /usr/local/ [root@localhost local]# ln -sv mysql-5.7.22-linux-glibc2.12-x86_64/ mysql ‘mysql’ -> ‘mysql-5.7.22-linux-glibc2.12-x86_64/’ [root@localhost local]# ll total 0 drwxr-xr-x. 2 root root 6 Mar 10 2016 bin drwxr-xr-x. 2 root root 6 Mar 10 2016 etc drwxr-xr-x. 2 root root 6 Mar 10 2016 games drwxr-xr-x. 2 root root 6 Mar 10 2016 include drwxr-xr-x. 2 root root 6 Mar 10 2016 lib drwxr-xr-x. 2 root root 6 Mar 10 2016 lib64 drwxr-xr-x. 2 root root 6 Mar 10 2016 libexec lrwxrwxrwx 1 root root 36 Aug 14 16:00 mysql -> mysql-5.7.22-linux-glibc2.12-x86_64/ drwxr-xr-x 9 root root 129 Aug 14 00:16 mysql-5.7.22-linux-glibc2.12-x86_64 drwxr-xr-x. 2 root root 6 Mar 10 2016 sbin drwxr-xr-x. 5 root root 49 Jun 13 19:03 share drwxr-xr-x. 2 root root 6 Mar 10 2016 src //修改目录/usr/local/mysql的属主属组 [root@localhost ~]# chown -R mysql.mysql /usr/local/mysql [root@localhost ~]# ll /usr/local/mysql -d lrwxrwxrwx 1 mysql mysql 36 Aug 14 16:00 /usr/local/mysql -> mysql-5.7.22-linux-glibc2.12-x86_64/ //配置环境变量 [root@localhost ~]# echo 'export PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh [root@localhost ~]# . /etc/profile.d/mysql.sh [root@localhost ~]# echo $PATH /usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
创建各个数据存放的目录
[root@localhost ~]# mkdir -p /opt/data/{3306,3307,3308} [root@localhost ~]# chown -R mysql.mysql /opt/data/ [root@localhost ~]# ll /opt/data/ 总用量 0 drwxr-xr-x 2 mysql mysql 6 5月 9 21:24 3306 drwxr-xr-x 2 mysql mysql 6 5月 9 21:24 3307 drwxr-xr-x 2 mysql mysql 6 5月 9 21:24 3308 [root@localhost ~]# tree /opt/data/ /opt/data/ ├── 3306 ├── 3307 └── 3308 3 directories, 0 files
初始化各实例
//初始化3306实例 [root@localhost ~]# mysqld --initialize --datadir=/opt/data/3306 --user=mysql 2019-05-10T01:43:33.987463Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2019-05-10T01:43:34.565759Z 0 [Warning] InnoDB: New log files created, LSN=45790 2019-05-10T01:43:34.733540Z 0 [Warning] InnoDB: Creating foreign key constraint system tables. 2019-05-10T01:43:34.808595Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 061b480e-72c5-11e9-ae30-000c29c0ed3b. 2019-05-10T01:43:34.810131Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened. 2019-05-10T01:43:34.837499Z 1 [Note] A temporary password is generated for root@localhost: Y=lJV79Rkx,d [root@localhost ~]# echo 'Y=lJV79Rkx,d' > 3306_pass //初始化3307实例 [root@localhost ~]# mysqld --initialize --datadir=/opt/data/3307 --user=mysql 2019-05-10T01:45:41.206120Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2019-05-10T01:45:42.082891Z 0 [Warning] InnoDB: New log files created, LSN=45790 2019-05-10T01:45:42.258639Z 0 [Warning] InnoDB: Creating foreign key constraint system tables. 2019-05-10T01:45:42.352269Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 5220e72b-72c5-11e9-b195-000c29c0ed3b. 2019-05-10T01:45:42.353339Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened. 2019-05-10T01:45:42.354494Z 1 [Note] A temporary password is generated for root@localhost: bpG+yqeGN8G: [root@localhost ~]# echo 'bpG+yqeGN8G:' > 3307_pass //3308 [root@localhost ~]# mysqld --initialize --datadir=/opt/data/3308 --user=mysql 2019-05-10T01:46:52.707755Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2019-05-10T01:46:53.546346Z 0 [Warning] InnoDB: New log files created, LSN=45790 2019-05-10T01:46:53.732779Z 0 [Warning] InnoDB: Creating foreign key constraint system tables. 2019-05-10T01:46:53.810767Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 7cb89aad-72c5-11e9-b5a1-000c29c0ed3b. 2019-05-10T01:46:53.813509Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened. 2019-05-10T01:46:53.815051Z 1 [Note] A temporary password is generated for root@localhost: wior7yf:1Awu [root@localhost ~]# echo 'wior7yf:1Awu' > 3308_pass
安装perl
[root@localhost ~]# yum -y install perl
配置配置文件/etc/my.cnf
[root@localhost ~]# vim /etc/my.cnf [mysqld_multi] mysqld = /usr/local/mysql/bin/mysqld_safe mysqladmin = /usr/local/mysql/bin/mysqladmin [mysqld3306] datadir = /opt/data/3306 port = 3306 socket = /tmp/mysql3306.sock pid-file = /opt/data/3306/mysql_3306.pid log-error=/var/log/3306.log [mysqld3307] datadir = /opt/data/3307 port = 3307 socket = /tmp/mysql3307.sock pid-file = /opt/data/3307/mysql_3307.pid log-error=/var/log/3307.log [mysqld3308] datadir = /opt/data/3308 port = 3308 socket = /tmp/mysql3308.sock pid-file = /opt/data/3308/mysql_3308.pid log-error=/var/log/3308.log
启动各实例
[root@localhost ~]# mysqld_multi start 3306 [root@localhost ~]# mysqld_multi start 3307 [root@localhost ~]# mysqld_multi start 3308 [root@localhost ~]# ss -antl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 80 :::3307 :::* LISTEN 0 80 :::3308 :::* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 80 :::3306 :::*
初始化密码
[root@localhost ~]# ls 3306_pass 3307_pass 3308_pass anaconda-ks.cfg [root@localhost ~]# cat 3306_pass Y=lJV79Rkx,d [root@localhost ~]# mysql -uroot -p'Y=lJV79Rkx,d' -S /tmp/mysql3306.sock 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 3 Server version: 5.7.22 Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. 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> set password = password('wangqing123!'); Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> quit Bye [root@localhost ~]# cat 3307_pass bpG+yqeGN8G: [root@localhost ~]# mysql -uroot -p'bpG+yqeGN8G:' -S /tmp/mysql3307.sock -e 'set password = password("wangqing123!");' --connect-expired-password mysql: [Warning] Using a password on the command line interface can be insecure. [root@localhost ~]# cat 3308_pass wior7yf:1Awu [root@localhost ~]# mysql -uroot -p'wior7yf:1Awu' -S /tmp/mysql3308.sock -e 'set password = password("wangqing123!");' --connect-expired-password mysql: [Warning] Using a password on the command line interface can be insecure.