本次搭建整体规划(root整合操作)
主机 | ip | 说明 |
centosnode01 | 192.168.227.136 | Master |
centosnode02 | 192.168.227.137 | Slave1 |
centosnode03 | 192.168.227.138 | Slave2 |
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安装的中的两个小警告:
- [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)
至此,主从(一主两从复制搭建完成)