MySQL5.7源代码安装及主从复制搭建

本次搭建整体规划(root整合操作)

主机ip说明
centosnode01192.168.227.136Master
centosnode02192.168.227.137Slave1
centosnode03192.168.227.138Slave2

MySQL5.7源代码安装(源码安装 【Server version: 5.7.17】 )

wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz

创建MySql安装程序的目录

      mkdir -p /usr/local/mysql

创建MySql数据文件的目录

      mkdir -p /usr/local/mysql/data

      groupadd mysql

      useradd -r -g mysql mysql

Mysql 单机主从复制:

  MySql服务可以采用主从机制进行备份,如果一对一进行备份对应生产环境而言比较浪费资源,主服务器吧数据变化记录到主日志,然后从服务通过I/O线程读取主服务器的日志,并将它写入到从服务的中继日志中,接着SQL线程读取中继日志,并且在从服务器上重放,从而实现MySQL复制,具体如图:后期补充架构图

MySQL具有可以运行多个实例的功能,这个功能是通过mysql_multi实现的。当一台机器上需要运行多个MySQL服务器的时候,mysql_multi是管理多个mysql的服务进程,这些服务进程用不同的unix socket或者是监听不同端口,通过命令,可以启动,关闭和报告所管理的服务器的状态.

下面在同一台服务器上使用mysql_multi管理多个MySQL服务进程.

  tar -zxvf mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz  -C /usr/local/mysql/

      cd  /usr/local/mysql

      mv * ..   移动并删除

     chown -R mysql:mysql mysql/

     cd /usr/local/mysql/support-files

     cp my-default.cnf /etc/my.cnf   拷贝配置模板文件覆盖centos7默认安装的mariadb数据库的配置文件

vi my.cnf做如下的配置

# 指定默认的端口

     port = 3306

# 指定Mysql绑定的IP

     bind-address=0.0.0.0

# 指定数据目录

    datadir=/usr/local/mysql/data

    socket=/var/lib/mysql/mysql.sock

# 指定启动时使用的用户

    user=mysql

# 指定时区与系统一致

    default-time-zone=system

# 指定的存储引擎为InnoDB

     default-storage-engine=InnoDB

# 指定错误日志的位置

     log-error=/var/log/mysqld.log

# 设置进程目录

#pid-file=/var/run/mysqld/mysqld.pid   - 这是基于内存的目录,重新启动后会被清掉

       pid-file=/var/lib/mysqld/mysqld.pid   --- 一切都不会有问题

# 默认配置MYSQL模式

 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

# 最大连接数

    max_connections=5000

# 数据库编码utf8

    character_set_server=utf8

    init_connect='SET NAMES utf8'

    explicit_defaults_for_timestamp=true

#不区分大小写 0: 大小写敏感; 1:大小写不敏感

    lower_case_table_names = 1

将启动脚本放到/etc/init.d目录中

      cp support-files/mysql.server   /etc/init.d/mysqld

将mysqld添加为系统服务

      chkconfig --add mysqld

修改/etc/init.d/mysql参数

       vi /etc/init.d/mysqld

       basedir=/usr/local/mysql

       datadir=/usr/local/mysql/data

添加服务mysql

        chkconfig --add mysqld

设置mysql服务为自启动

      chkconfig mysqld on

初始化 mysql 的数据库

       cd /usr/local/mysql/bin/

       ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data     报下面的警告

有异常提示:TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details

解决办法:

配置文件增加

[mysqld]

    explicit_defaults_for_timestamp=true

[ERROR] --initialize specified but the data directory has files in it. Aborting.

    cd /usr/local/mysql/data

    rm -rf *

    cd /usr/local/mysql/bin/

再次执行初始化 mysql 的数据库(产生临时密码xhjt6dwfKa.< )

    ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

     firewall-cmd --permanent --add-port=3306/tcp

    firewall-cmd --reload

设置mysql的远程访问

设置远程访问账号:grant all privileges on . to 远程访问用户名@’%’ identified by ‘用户密码’;

#添加环境变量,并使/etc/profile环境变量生效

     echo "export PATH=$PATH:/usr/local/mysql/bin">>/etc/profile

     sleep 3

     source /etc/profile

/var/log/mysqld.log   查看日志,未启动

     Starting MySQL.. ERROR! The server quit without updating PID file (/var/run/mysqld/mysqld.pid).

#mkdir -p /var/run/mysqld/

     mkdir -p /var/lib/mysqld/

#chown -R mysql:mysql /var/run/mysqld/

       chown -R mysql:mysql /var/lib/mysqld/

        systemctl start|start|restart|stop|status  mysqld

        ps -ef|grep mysql

/var/run/mysqld 目录每次重启后都需要手动去创建,是因为/var/run/目录下建立文件夹是在内存中,故每次重启后内存被清空导致/var/run/mysqld 也被清除,从而导致无法启动mysql


systemctl daemon-reload   //重构进程

MySQL 5.7 以后,不在允许使用空密码进行登录,默认会初始化一个密码到 MySQL Error 日志中,配置参数 log-error= 指定的文件。

登录MySQL的:

cd /usr/local/mysql/bin

./mysql -uroot -p                     之前的密码忘记了

如下解决方案:

vi /etc/my.cnf

skip-grant-tables   ---- 配置不需密码认证

=============================centosnode02=====================================

centosnode02机器安装MYSQL服务器

跨主机之间的拷贝:

      scp -r mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz  root@centosnode02:/tools

在另外一台机器(远程主机)上拉取centosnode01机器上的相关文件

      scp -r -P 22 root@centosnode01:/etc/profile  /etc

      scp -r -P 22 root@centosnode01:/etc/my.cnf /etc

      scp -r -P 22 root@centosnode01:/etc/init.d/mysqld /etc/init.d/

      scp -r -P 22 root@centosnode02:/usr/local/mysql  /usr/local/

vi  /etc/my.cnf   

# 指定默认的端口

     port = 3307

# 指定Mysql绑定的IP

     bind-address=0.0.0.0                   # 避免虚拟机 nat模式出问题

     mkdir -p /usr/local/mysql/data

     mkdir -p /var/lib/mysqld/        ---放pid文件

     mkdir -p /var/lib/mysql          ---放sock文件

     groupadd mysql

     useradd -r -g mysql mysql

     chown -R mysql:mysql /var/lib/mysqld/

     chown -R mysql:mysql /var/lib/mysql/

     chkconfig --add mysqld

     chkconfig mysqld on

      firewall-cmd --permanent --add-port=3307/tcp

      firewall-cmd --reload

源代码安装日志报错:

   [ERROR] Can't open and lock privilege tables: Table 'mysql.servers' doesn't exist

    2019-11-26T06:06:20.120691Z 0 [ERROR] Native table 'performance_schema'.'cond_instances' has the wrong structure

解决方案:

   cd /usr/local/mysql/data

   rm -rf *

   cd /usr/local/mysql/bin/

   ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

   cat /var/log/mysqld.log  错误日志没有问题,则可以启动

   chown -R mysql:mysql /usr/local/mysql

修改root密码为: root123456

    use mysql;

   UPDATE user SET authentication_string = password ('root123456') WHERE User = 'root';

   show global variables like 'port';  ---查看mysql端口

mysql当执行flush privileges刷新用户权限命令报出ERROR 1146 (42S02): Table 'mysql.servers' doesn't exist这样测错误,字面上的意思就很明显说mysql.servers不存在

再次执行命令:

   flush privileges;   这样就没问题

   vi /etc/my.cnf

# 允许初始化无密码登录

#symbolic-links=0

#skip-grant-tables

   mysql> show databases;

ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.   报错解决方案

[root@centosnode01 ~]# set global validate_password_policy=0;

[root@centosnode01 ~]# set global validate_password_length=1;

mysql> SET PASSWORD = PASSWORD('123456');

登录验证是否成功:

mysql -uroot -p  

注意:5.7版本以前的授权方式

mysql> GRANT ALL PRIVILEGES ON *.* TO root@"*"  IDENTIFIED BY "123456" WITH GRANT OPTION;

5.7版本后的授权方式:

   GRANT ALL PRIVILEGES ON *.* TO root@"%"  IDENTIFIED BY "123456" WITH GRANT OPTION;

   mysql> flush privileges;

   vi /var/log/mysqld.log   多看日志排查问题

同理,参照centosnode02节点的步骤搭建centosnode03节点

 

===================================结束=======================================

各种授权推演:

一、创建用户:以root用户登录到数据库进行用户创建

  命令:

CREATE USER 'username'@'host' IDENTIFIED BY 'password';

  例如:

CREATE USER 'test_admin'@'localhost' IDENTIFIED BY 'admin@123_S';CREATE USER 'test_admin2'@'%' IDENTIFIED BY '';

note:

username——将要创建的用户名;

host——指定该用户在哪个主机上可以登录,"localhost"指该用户只能在本地登录,不能在另外一台机器上远程登录,如果想远程登录,将"localhost"改为"%",表示在任何一台电脑上都可以登录;也可以指定某台机器可以远程登录;

password——该用户的登录密码,密码可以为空,若为空则该用户可以不需要密码登录服务器。

二、授权:以root用户登录到数据库进行授权

  命令:

GRANT privileges ON databasename.tablename TO 'username'@'host'

   note: 

privileges——用户的操作权限,如SELECT等。如果授予所有权限则使用ALL。

databasename——数据库名称。tablename——表名。如果要给该用户授予对所有数据库和表的相应操作权限则可用*表示,例如*.*

  例如:

GRANT SELECT ON test_db.* TO 'test_admin2'@'%';

flush privileges;

note:必须执行flush privileges;

三、撤销用户权限

  命令:

REVOKE privilege ON databasename.tablename FROM 'username'@'host';

  例如:

REVOKE SELECT ON test_db.* FROM 'test_min'@'%';

四、删除账户及权限:

  命令:

drop user 'username'@'host';

五、查看用户的授权

  命令:

SHOW GRANTS FOR 'username'@'host'

  例如:

mysql> SHOW GRANTS FOR 'test_admin'@'%' ;+----------------------------------------------------------------+| Grants for test_admin@%                                        |+----------------------------------------------------------------+| GRANT USAGE ON *.* TO 'test_admin'@'%'                         || GRANT ALL PRIVILEGES ON `test_manage_db`.* TO 'test_admin'@'%' |+----------------------------------------------------------------+2 rows in set (0.00 sec)

 

MySql安装的中的两个小警告:

  1. [Warning] Failed to set up SSL because of the following SSL library error: SSL context is not usable without certificate and private key

在5.7中,通过ssl方式连接mysql被作为默认和推荐。如果你并不需要(比如web端和db端同一台服务器,db服务器处于web端内网等),就可以不用使用ssl方式。
干掉警告很简单,只要在my.cnf声明跳过ssl就行了。
skip-ssl

=================================主从复制搭建===================================

Mysql 主重复制的准备工作:

      Mysql 开启binlog和慢查询日志

      binlog日志是二进制日志文件。它有两个作用:
     (1) 增量备份,即只备份新增的内容
     (2) 用于主从复制等(主节点维护了一个binlog日志文件,从节点从binlog中同步数据)

      my.cnf的位置一般在/etc/my.cnf,要在my.cnf中添加:

         [mysqld]

           log-bin=/var/log/mysql-binlog/mysql-binlog

           server-id=1

           slow_query_log=ON

           slow_query_log_file=/var/log/mysql-show/mysql-slow.log

           long_query_time=1

           mkdir -p /var/log/mysql-binlog/mysql-binlog  -- 创建的是目录

           mkdir -p /var/log/mysql-slow/                -- 创建的是目录,日志文件启动的时候会自动创建

           chown -R mysql:mysql /var/log/mysql-slow/

           chown -R mysql:mysql /var/log/mysql-binlog/

            systemctl start mysqld

启动日志如下:

show variables like '%log_bin%';

+---------------------------------+------------------------------------------+

| Variable_name                   | Value                                    |

+---------------------------------+------------------------------------------+

| log_bin                         | ON                                       |

| log_bin_basename                | /var/log/mysql-binlog/mysql-binlog       |

| log_bin_index                   | /var/log/mysql-binlog/mysql-binlog.index |

| log_bin_trust_function_creators | OFF                                      |

| log_bin_use_v1_row_events       | OFF                                      |

| sql_log_bin                     | ON                                       |

+---------------------------------+------------------------------------------+

查询当前mysql数据库是否开启了慢查询日志功能:

       show VARIABLES like '%slow%';

       mysql> show VARIABLES like '%slow%';

+---------------------------+------------------------------------+

| Variable_name             | Value                              |

+---------------------------+------------------------------------+

| log_slow_admin_statements | OFF                                |

| log_slow_slave_statements | OFF                                |

| slow_launch_time          | 2                                  |

| slow_query_log            | OFF                                |

| slow_query_log_file       | /var/log/mysql-slow/mysql-slow.log |

+---------------------------+------------------------------------+

不知道设置重启后还是OFF,解决方案

rm -rf /var/log/mysql-slow/mysql-slow.log  该日志为手动创建的,删掉后重启,即可自动生成该日志文件,再次查看慢日志已经打开

mysql> show variables like '%slow%';

+---------------------------+------------------------------------+

| Variable_name             | Value                              |

+---------------------------+------------------------------------+

| log_slow_admin_statements | OFF                                |

| log_slow_slave_statements | OFF                                |

| slow_launch_time          | 2                                  |

| slow_query_log            | ON                                 |

| slow_query_log_file       | /var/log/mysql-slow/mysql-slow.log |

+---------------------------+------------------------------------+

slow_query_log的值是ON,代表当前数据库已经开启了慢查询功能。slow_query_log_file表示慢日志的路径。

还可以查看超过多少秒算是慢查询:

show VARIABLES like 'long_query_time';

mysql> show VARIABLES like 'long_query_time';

+-----------------+----------+

| Variable_name   | Value    |

+-----------------+----------+

| long_query_time | 1.000000 |

+-----------------+----------+

默认是10秒,这里已经被配置为1秒了

查看数据库的存储目录

    show variables like '%datadir%';

查询当前mysql数据库是否开启了binlog日志功能:

     show VARIABLES like 'log_%';

查看binlog格式:

      show variables like 'binlog_format';

获取binlog文件列表:

     show binary logs;

只查看第一个binlog文件的内容

    show binlog events;

查看当前正在写入的binlog文件

    show master status\G;

查看数据库的存储引擎

    show engines;

查看某张表的存储引擎:

mysql> use 数据库

show create table 表名;

异常解决方案一:

mysql> alter table servers engine =InnoDB;

ERROR 1050 (42S01): Table './mysql/servers' already exists

cd /usr/local/mysql/data/mysql

ls -l | grep  'servers' | wc -l

rm -rf servers.*

把centosnode02机器上所有的mysql库下面的文件全部拷贝到centosnode01机器的mysql库中即可

scp -r * root@centosnode01:/usr/local/mysql/data/mysql/

chown -R mysql:mysql  /usr/local/mysql/  

 

use mysql;

show create table servers; 查看该系统表的存储引擎是否已经更改过来

在master上配置复制所需要的账号,这里创建一个mysql_repl的用户,%表示任何远程地址的mysql_repl用户都可以连接到master主机

centos上的密码是不能被查看的,只能适用root进行修改。

查看整个系统用户的命令:

grep bash /etc/passwd

查看系统中有那些用户

cut -d : -f 1 /etc/passwd

查看可以登录到系统的用户有那些

cat /etc/passwd | grep -v /sbin/nologin | cut -d : -f 1

groupadd mysql_repl

useradd -r -g mysql_repl mysql_repl

passwd mysql_repl   设置用户的密码

123456

GRANT replication slave ON *.* TO 'mysql_repl'@'*' identified by '123456';

flush privileges;

导入数据源:

create database if not exists security;

use security;

mysql> soure /tools/device_data_record.sql

==============================验证主从复制是否成功======================================

在主master服务器执行如下命令:

mysql> show master status;

在从服务器上分别执行如下命令:

mysql> change master to Master_Log_File='mysql-binlog.000060',Master_Log_Pos=154;

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status \G

  • Slave_IO_State: Waiting for master to send event
  •  Slave_IO_Running: Yes
  •  Slave_SQL_Running: Yes

出现这些信息:一般主从复制配置成功

再次验证:

在主服务器上创建一张表:(centosnode01主节点)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| geospatial_table   |
| hdfs_hive          |
| hive_db            |
| log_analysis       |
| mysql              |
| nacos              |
| performance_schema |
| spark_db           |
| sys                |
+--------------------+
10 rows in set (0.01 sec)

新建一个数据库

mysql> create database testdata;
Query OK, 1 row affected (0.01 sec)

mysql> use testdata;
Database changed

新建一张表
mysql> create table tab1(id int auto_increment,name varchar(10),primary key(id));

Query OK, 0 rows affected (0.02 sec)

插入记录 

mysql> insert into tab1(id,name) values (1,'why');
Query OK, 1 row affected (0.18 sec)

在服务器上查看是否复制成功:(hadoopnode01,hadoopnode02节点)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| security           |
| sys                |
| testdata           |
+--------------------+
6 rows in set (0.00 sec)

mysql> use testdata;
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_testdata |
+--------------------+
| tab1               |
+--------------------+
1 row in set (0.00 sec)

mysql> desc tab1;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)

mysql> select * from tab1;
+----+------+
| id | name |
+----+------+
|  1 | why  |
+----+------+
1 row in set (0.00 sec)
 

至此,主从(一主两从复制搭建完成)
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值