mysql
源码编译安装
解压源码包
tar zxf mysql-boost-5.7.31.tar.gz
下载gcc和gcc-c++和cmake
yum install gcc gcc-c++ cmake -y
配置
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #安装根目录
-DMYSQL_DATADIR=/data/mysql \ #数据存储目录
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \ #UNIX socket文件
-DWITH_INNOBASE_STORAGE_ENGINE=1 \ #启用InnoDB存储引擎
-DSYSCONFDIR=/etc \ #配置文件(my.cnf)目录
-DENABLED_LOCAL_INFILE=1 \ #启用加载本地数据
-DWITH_EXTRA_CHARSETS=all \ #扩展字符支持
-DDEFAULT_CHARSET=utf8mb4 \ #默认字符集
-DDEFAULT_COLLATION=utf8mb4_general_ci \ #默认字符校对
-DWITH_BOOST=/root/mysql-5.7.31/boost/boost_1_59_0 #安装boost
Mysql5.7版本更新后有很多变化,比如json等,连安装都有变化,他安装必须要BOOST库,不过mysql的官网源码有带boost库的源码和不带boost库的源码两种,因此有两种安装方式,其实都是一样的,仅仅是不带boost库源码的需要单独安装boost
编译
make
安装
make install
拷贝文件
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
将mysql的命令加入到系统全局变量
vim ~/.bash_profile
source ~/.bash_profile
创建一个mysql用户
useradd -M -d /data/mysql -s /sbin/nologin mysql
创建mysql数据存储目录,并且修改所属人和所属组
mkdir -p /data/mysql ;chown mysql.mysql /data/mysql
初始化数据库,不生成随即密码,初始化完成后会在数据库存储目录生成文件
mysqld --initialize-insecure --user=mysql
进入数据库存储目录
cd /data/mysql
也可以在初始化的时候生成一个随机密码,如果初始化过了,需要将数据库存储目录清空后再进行初始化
mysqld --initialize --user=mysql
此时可以看到随机密码:C3q#qUp.64FD
启动mysql
/etc/init.d/mysqld start
可以看到报错
修改mysql的配置文件
vim /etc/my.cnf
再次启动
此时进行数据库安全初始化
mysql_secure_installation
输入刚刚生成的随机密码,如果没有生成,直接空格即可,再设置新的密码
用新密码进入到mysql,看一下有哪些数据库
mysql -pwestos
show databases;
安装数据库的图形化程序phpMyAdmin
解压phpMyAdmin的zip包
unzip phpMyAdmin-5.0.2-all-languages.zip
讲解压后的文件拷贝到nginx默认发布目录中,并创建软连接,方便访问
cp -r phpMyAdmin-5.0.2-all-languages /usr/local/nginx/html/
ln -s /usr/local/nginx/html/phpMyAdmin-5.0.2-all-languages/ /usr/local/nginx/html/phpMyAdmin
进入到nginx的配置文件目录
/usr/local/nginx/conf
修改配置文件
vim nginx.conf
修改加入默认index.php
打开php模块
浏览器进入phpMyAdmin
172.25.21.1/phpMyAdmin
使用root和设置的密码登陆,报错,这个错误的原因是找不到socket文件
修改php的主配置文件
vim php.ini #主配置文件在php安装目录下的etc下
平滑更新一下php
systemctl reload php-fpm.service
此时再次登陆phpMyAdmin
用图形化界面创造一个808bass数据库,user_tb表,添加一些数据
进入到mysql,并查看是否创建成功
mysql -pwestos
mysql> show databases; #查看库
mysql> use 808bass #进入库
mysql> show tables; #查看表
mysql> select * from user_tb; #查看表内存储的信息
mysql 主从复制
首先为了快速实验,我们将server1作为master server2作为slave
为了方便快速 我们可以从server1拷贝mysql安装目录、配置文件和启动文件到server2
scp -r /usr/local/mysql server2:/usr/local/mysql
scp /etc/my.cnf server2:/etc/
scp /etc/init.d/mysqld server2:/etc/init.d/
把mysql命令加入全局环境变量
vim ~/.bash_profile
source ~/.bash_profile
创建用户,创建数据库存储目录,修改所属人和组
useradd -M -d /data/mysql -s /sbin/nologin mysql
mkdir -p /data/mysql ;chown mysql.mysql /data/mysql
数据库初始化
mysqld --initialize-insecure --user=mysql
启动数据库
/etc/init.d/mysqld start
数据库安全初始化
mysql_secure_installation
此时在server1 也就是master端
vim /etc/my.cnf
log-bin=mysql-bin #打开二进制日志
server-id=1 #设置一个server-id 不然默认是0 会导致冲突或者不知道来自哪个主机
修改配置文件需要重启mysql
/etc/init.d/mysqld restart
此时进入到mysql
[root@server1 ~]# mysql -pwestos
mysql> show master status;
可以看到master的状态 文件和Pos
创建一个用户,给他slave的权限,并且是可以通过网络连接进来的
grant replication slave on *.* to repl@'%' identified by 'westos';
此时在slave上测试,是否能连接
[root@server2 mysql]# mysql -pwestos -h 172.25.21.1 -urepl
mysql> show databases;
可以看到库,说明成功
此时修改salve(也就是server2)的mysql配置文件
vim /etc/my.cnf
只需要增加一个server-id=2
重启mysql
/etc/init.d/mysqld restart
此时需要将之前在master的mysql写入的数据先导入到slave的mysql
在server1:
[root@server1 ~]# mysqldump -pwestos 808bass >dump.sql #备份
[root@server1 ~]# scp dump.sql server2: #将文件传到slave
在server2:
[root@server2 ~]# mysqladmin -pwestos create 808bass
[root@server2 ~]# mysql -pwestos 808bass <dump.sql
[root@server2 ~]# mysql -p westos
mysql> select * from 808bass.user_tb;
如果可以看到数据,那么就是导入成功
此时修改salve选择的master端
先看一下master的File名字和Pos
此时在server2:
需要写对master的ip、用户名、密码、二进制日志的名字和pos
mysql -pwestos
mysql> change master to master_host='172.25.21.1', master_user='repl', master_password='westos', master_log_file='mysql-bin.000001', master_log_pos=437;
mysql> start salve; #打开slave
mysql> show slave status\G; #查看salve状态
如果看到两个yes,那就是设置成功
测试查看:
通过图形化或者命令模式增加一些数据
在server2:
查看808bass库的user_tb表有没有数据同步过来
mysql -pwestos
select * from 808bass.user_tb;
如果同步过来,代表成功!
Gtid实现主从复制
我们此时要做的是:
server1作为server2的master server2是server1的slave
server2作为server3的master server3是server2的slave
server1:
修改mysql的配置文件
vim /etc/my.cnf
开启log-slave-updates和gid_mode功能
启用enforce_gtid_consistency功能的时候,MySQL只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行
重启mysql
/etc/init.d/mysqld restart
进入mysql
mysql -pwestos
show master status;
此时file已经变成了新的文件
server2:
修改mysql的配置文件
vim /etc/my.cnf
跟1设置一样,就是server-id不能一致
重启mysql
/etc/init.d/mysqld restart
进入mysql
由于我们使用gtid,我们不需要指定日志文件和pos,MASTER_AUTO_POSITION = 1直接启用基于GTID的复制
mysql -pwestos
stop slave; #先关闭slave
change master to master_host='172.25.21.1', master_user='repl', master_password='westos',MASTER_AUTO_POSITION = 1; #修改master
start slave;
show slave status\G;
此时查看状态,显示成功
server3:
此时重复上面的操作,快速在server3上安装mysql
scp -r /usr/local/mysql server3:/usr/local/mysql
scp /etc/my.cnf server3:/etc/
scp /etc/init.d/mysqld server3:/etc/init.d/
把mysql命令加入全局环境变量
vim ~/.bash_profile
source ~/.bash_profile
useradd -M -d /data/mysql -s /sbin/nologin mysql
mkdir -p /data/mysql ;chown mysql.mysql /data/mysql
mysqld --initialize-insecure --user=mysql
/etc/init.d/mysqld start
mysql_secure_installation
修改server3的mysql的配置文件 注意需要将server-id修改成3
重启
/etc/init.d/mysqld restart
此时回到server2:
创建一个server3在同步server2的mysql时候的用户
grant replication slave on *.* to repl@'%' identified by 'westos';
备份一下mysql的数据,我们做主从用了gtid时,用mysqldump备份时就要加–set-gtid-purged=OFF,否则你在主上导入恢复了数据,主没有了binlog日志,同步则不会被同步
mysqldump -pwestos 808bass --set-gtid-purged=OFF >dump.sql
scp dump.sql server3:
回到server3
[root@server3 ~]# mysqladmin -pwestos create 808bass
[root@server3 ~]# mysql -pwestos 808bass <dump.sql
select * from 808bass.user_tb; #查看是否备份成功
此时进入数据,修改master 指向ip 172.25.21.2
change master to master_host='172.25.21.2', master_user='repl', master_password='westos',MASTER_AUTO_POSITION = 1;
开启slave以及查看状态
start slave;
show slave status\G;
此时在server1的mysql插入数据
server2查看数据是否同步
server3查看数据是否同步
mysql的主从复制主要有3种模式
mysql默认是主从异步复制
性能消耗低,但是容易出现主从数据唯一性问题
mysql主从同步复制
数据完整性好,但是性能消耗高
mysql主从半自动复制
介于上面两种之间。既能很好的保持完整性,又能提高性能
首先在master端打开
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
在slave端打开
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
查看master插件状态
show status like 'rpl%';
可以看到是关闭的
启动插件
SET GLOBAL rpl_semi_sync_master_enabled =1;
再次查看
show status like 'rpl%';
此时已经打开
查看slave端插件状态
show status like 'rpl%';
打开插件
SET GLOBAL rpl_semi_sync_slave_enabled =1;
再次查看
show status like 'rpl%';
发现还是关闭的
我们需要重新打开salve的io线程的thread
stop slave io_thread;
start slave io_thread;
此时再次查看,已开启
测试:
在server1:
插入数据,并且可以看到有一个yes返回,没有no返回
此时数据已经复制完成
关闭slave的io_thread线程
再次插入数据,由于设置的超时时间为10s,等待十秒后,no返回1,yes不返回,然后切回主从异步复制
此时再次打开io_thread,查看数据库内容,可以看到自动去匹配tgid然后复制缺少的数据