boost库不带的话,编译时会出问题,这是c++的库,编译时会有依赖性
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DSYSCONFDIR=/etc -DWITH_EXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_BOOST=/root/mysql-5.7.31/boost/boost_1_59_0
[root@server5 mysql-5.7.31]# yum install bison -y
mysql8直接使用InnoDB存储,把myisam引擎去掉了
Mysql存储引擎InnoDB
MyISAM与InnoDB 的区别
解决编译时出现的问题
重新编译
make
make -j4 表示用4个cpu去算,但不建议,因为是虚拟机,内存不够,如果开多个核心并行计算时,会造成内存溢出的问题。make中间会有一些红色的报错,只要不停下来就没有影响,编译时比较慢。
安装
创建mysql用户
[root@server5 mysql-5.7.31]# useradd -s /sbin/nologin -M -d /data/mysql mysql
[root@server5 mysql-5.7.31]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
[root@server5 mysql-5.7.31]# cd /usr/local/mysql/
[root@server5 mysql]# cd bin/
[root@server5 bin]# pwd
/usr/local/mysql/bin
[root@server5 bin]# vim ~/.bash_profile
[root@server5 bin]# source ~/.bash_profile
使用mysql用户属性初始化,并修改密码
[root@server5 bin]# mysqld --initialize --user=mysql #初始化
[root@server5 bin]# /etc/init.d/mysqld start #开启mysql
[root@server5 bin]# mysql_secure_installation #修改密码
测试
![在这里插入图片描述](https://img-blog.csdnimg.cn/6e13bdf44d0f45a1bb08809af747f9cd.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aSa5LqO5bCR55
phpMyAdmin,它是用 PHP 脚本写的 MySQL 数据库的管理软件,是使用 Web 图形模式直接管理 MySQL 数据库的工具。phpMyAdmin 可以用来创建、修改、删除数据库和数据表;可以用来创建、修改、删除数据记录;可以用来导入和导出整个数据库;还可以完成许多其他的 MySQL 系统管理任务
linux phpmyadmin安装及配置过程
php的mysqlnd驱动
[root@westos_student73 file_recv]# scp phpMyAdmin-5.0.2-all-languages.zip server5:/usr/local/nginx/html
安装phpMyAdmin软件,图形管理界面
[root@server5 mysql]# cd /usr/local/nginx/html/
[root@server5 html]# unzip phpMyAdmin-5.0.2-all-languages.zip
开启php-fpm服务
[root@server5 html]# ln -s phpMyAdmin-5.0.2-all-languages myadmin
[root@server5 myadmin]# systemctl start php-fpm.service
[root@server5 myadmin]# netstat -antlp
开启Nginx,并查看端口
[root@server5 myadmin]# nginx
[root@server5 myadmin]# netstat -antlp
修改配置文件,指定默认发布页面
[root@server5 myadmin]# cd /usr/local/nginx/
[root@server5 nginx]# cd conf/
[root@server5 conf]# vim nginx.conf
location / {
root html;
index index.php index.html index.htm;
}
}
修改php.in配置文件
[root@server5 conf]# cd /usr/local/php/
[root@server5 php]# cd etc/
[root@server5 etc]# vim php.ini
pdo_mysql.default_socket= /data/mysql/mysql.sock
mysqli.default_socket = /data/mysql/mysql.sock
[root@server5 etc]# systemctl reload php-fpm
下载压缩包
解压压缩包
创建软链接,并开启php-fpm服务
开启nginx
浏览器访问进行测试
index.php不是默认发布页面,所以需要指定到该页面
修改配置文件,指定默认发布页面
修改php.in配置文件
实验中出现的问题,实验时没有发现/data/mysql数据库的权限是750,导致虽然给php-fpm指定了sock文件,但是没有访问权限,也就无法连接数据库
解决方法: 将文件权限改为755即可
看到该界面表示整个Lamp架构部署成功,访问的是nginx,但是因为是php文件,所以交给php-fpm处理,动态语言代码中要连接数据库,访问数据库,然后取数据,返回nginx,最后再返回浏览器。
sa是system administrator的简写,即系统管理员的意思
注意初始化后,需要将数据库服务开启,才可以修改密码,否则会提示没有sock文件
mysql是现在普遍使用的数据库,但是如果宕机了必然会造成数据丢失。为了保证mysql数据库的可靠性。就要会一些提高可靠性的技术。
为什么要主从复制、读写分离?
主从复制、读写分离一般是一起使用的。目的很简单,就是为了提高数据库的并发性能。你想,假设是单机,读写都在一台MySQL上面完成,性能肯定不高。如果有三台MySQL,一台mater只负责写操作,两台salve只负责读操作,性能不就能大大提高了吗?
所以主从复制、读写分离就是为了数据库能支持更大的并发。
随着业务量的扩展、如果是单机部署的MySQL,会导致I/O频率过高。采用主从复制、读写分离可以提高数据库的可用性。
主从复制的作用
做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
架构的扩展: 业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
读写分离,使数据库能支持更大的并发。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。
1.在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;(主库写,从库读,降压)
2.在从服务器进行备份,避免备份期间影响主服务器服务;(确保数据安全)
3.当主服务器出现问题时,可以切换到从服务器。(提升性能)
Mysql主从复制原理:
Mysql的主从复制中主要有三个线程:master(binlog dump thread)、slave(I/O thread 、SQL thread),Master一条binlog dump thread线程和Slave中的I/O thread 、SQL thread两条线程。
master(binlog dump thread)主要负责Master库中有数据更新的时候,会按照binlog格式,将更新的事件类型写入到主库的binlog文件中。并且,Master会创建log dump线程通知Slave主库中存在数据更新,这就是为什么主库的binlog日志一定要开启的原因。
I/O thread线程在Slave中创建,该线程用于请求Master,Master会返回binlog的名称以及当前数据更新的位置、binlog文件位置的副本。然后,将binlog保存在 中继日志(relay log) 中,中继日志也是记录数据更新的信息。
SQL线程也是在Slave中创建的,当Slave检测到中继日志有更新,就会将更新的内容同步到Slave数据库中,这样就保证了主从的数据的同步。
主从复制过程:
当Master节点进行insert、update、delete操作时,会按顺序写入到binlog中。
salve从库连接master主库,Master有多少个slave就会创建多少个binlog dump线程。
当Master节点的binlog发生变化时,binlog dump 线程会通知所有的salve节点,并将相应的binlog内容推送给slave节点。
I/O线程接收到 binlog 内容后,将内容写入到本地的 relay-log。
SQL线程读取I/O线程写入的relay-log,并且根据 relay-log 的内容对从数据库做对应的操
作。
主从复制的类型
主从复制的过程有不同的策略方式进行数据的同步,主要包含以下几种:
1. 「同步策略」:Master会等待所有的Slave都回应后才会提交,这个主从的同步的性能会严重的影响。
2.「半同步策略」:Master至少会等待一个Slave回应后提交。
3.「异步策略」:Master不用等待Slave回应就可以提交。
4.「延迟策略」:Slave要落后于Master指定的时间。
Master提交后,所有连接的客户端就可以访问到数据了,mysql数据库不是写入就立刻可以访问的
需要两台装有mysql的主机sever5和server6
配置server6主机的mysql,不需要编译,直接复制文件过去就行,因为已经编译完成。
复制程序到server6
[root@server5 ~]# scp -r /usr/local/mysql/ server6:/usr/local/
复制配置文件到server6
[root@server5 etc]# scp my.cnf server6:/etc
复制启动脚本到server6
[root@server5 etc]# scp /etc/init.d/mysqld server6:/etc/init.d/
创建用户和目录,并修改权限
[root@server6 ~]# useradd -s /sbin/nologin -M -d /data/mysql mysql
[root@server6 ~]# id mysql
uid=1000(mysql) gid=1000(mysql) groups=1000(mysql)
[root@server6 ~]# mkdir -p /data/mysql
[root@server6 ~]# chown mysql.mysql /data/mysql/
添加mysql命令到环境变量
[root@server6 ~]# vim .bash_profile
PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
[root@server6 ~]# source .bash_profile
初始化数据库
[root@server6 ~]# mysqld --initialize --user=mysql
[root@server6 ~]# /etc/init.d/mysqld start
[root@server6 ~]# mysql_secure_installation
配置server6的mysql
复制程序到server6
复制配置文件到server6
复制启动脚本到server6
创建用户和目录,并修改权限
mysql的主从集群其实就是mysql主从复制,主从复制是mysql最成熟的技术了,包括后面的MGR集群(MySQL Group Replication)也是基于mysql的主从机制(复制技术)
配置server1的mysql的server-id和二进制日志名字
[root@server5 etc]# vim /etc/my.cnf
log-bin=mysql-bin
#激活二进制日志记录
server-id=1
#设置主从时id必须不同,默认id都为0,0表示禁止所有的复制
[root@server5 etc]# /etc/init.d/mysqld restart
#这是使用脚本重启,cmake编译时加WITH_SYSTEMD:BOOL=OFF,就会生成systemd的管控文件
查看二进制日志文件
mysql中创建用户repl,并进行授权
[root@server5 mysql]# mysql -p
Enter password:
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'westos';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
mysql> show master status;
编号表示复制从哪开始
还可以有以下配置:
mysql> FLUSH TABLES WITH READ LOCK; #该指令表示锁表,
slave配置server-id
[root@server6 ~]# vim /etc/my.cnf
[root@server6 ~]# /etc/init.d/mysqld restart
server-id=2
[root@server6 ~]# /etc/init.d/mysqld restart
[root@server6 ~]# mysql -p
mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.15', MASTER_USER='repl', MASTER_PASSWORD='westos', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=595;
mysql> start slave;
mysql> show slave status\G;
master端添加数据进行测试
创建数据库,添加表,表中含有的字段,字段类型 varchar(20) 可变长字符20个字符,not null 表示不为空
[root@server5 mysql]# mysql -p
Enter password:
mysql> create database westos;
mysql> use westos;
mysql> > create table users (
-> username varchar(20) not null,
-> password varchar(25) not null);
mysql> show tables;
mysql> desc users;
mysql> insert into users values ('user1','123');
mysql> insert into users values ('user2','456');
mysql> select * from users;
一主一从架构
slave端的I/O线程负责将master端发来的二进制日志记录保存到自己节点的数据目录中,保存为中继日志,并持久化到磁盘,比如server2-relay-bin.000002。
mysql主从复制基础数据不同,slave端的SQL线程会报错,这是因为mysql的主从复制并不是将数据直接同步过去,而是将数据文件中的内容复制过来,也就是Master端做啥,slave端做啥,但这样做的前提条件是base数据相同。
一主多从架构
一主多从的架构适合读多写少的场景,有两中模式,第一种:A—>B&A---->C;第二种:A---->B----->C,该模式下,A节点的压力会小一些。
复制应用、配置文件和启动脚本
[root@server5 ~]# scp -r /usr/local/mysql/ server7:/usr/local/
[root@server6 mysql]# scp /etc/my.cnf server7:/etc
[root@server6 mysql]# scp /etc/init.d/mysqld server7:/etc/init.d/
创建mysql用户,创建数据库目录并赋权限,将mysql命令添加到环境变量,修改server-id,启动mysql
[root@server7 ~]# useradd -s /sbin/nologin -M -d /data/mysql mysql
[root@server7 ~]# chown mysql.mysql /data/mysql/
[root@server7 ~]# vim .bash_profile
PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
[root@server7 ~]# source .bash_profil
[root@server7 ~]# vim /etc/my.cnf
server-id=3
[root@server7 ~]# cat /etc/my.cnf
[root@server7 ~]# mysqld --initialize --user=mysql
[root@server7 ~]# /etc/init.d/mysqld start
[root@server7 ~]# mysql_secure_installation
server5作为主服务器A,server6作为slave服务器B(该节点也需要有二进制日志,需要启用二进制日志),server7作为从服务器C
server6开启二进制日志,因为server7复制时是复制的二进制日志不是中继日志
回放的日志也要更新到二进制日志
测试,server5添加数据,看server6会将回放日志写入二进制日志
[root@server2 mysql]# mysqlbinlog mysql-bin.000001 -v #查看二进制日志详细信息
使用mysqldump备份server5的westos数据库信息,并拷贝到server7
备份数据库信息时需要锁表,因为当数据信息较大时,备份不会瞬间完成,备份时可能有人正在写入信息,那备份出来的的数据库和当前信息可能不一致,锁表就是可以读不能写。
用mysqldump的数据有一个坑
server7上创建数据库wesstos,并导入server5上备份的数据
server6创建repl用户,并赋权限replication slave
server7数据库指定复制主机和文件位置以及编号
测试
server5主服务器数据库插入数据