linux练习-06

1. 通过编译、二进制安装MySQL5.7

源码编译安装 MySQL

  • 建议:内存4G以上,CPU 核数越多越好
  • 说明:本操作过程适用于以下版本
mysql-5.6.51.tar.gz
mariadb-10.2.18.tar.gz
  • 安装相关依赖包
yum -y install gcc gcc-c++ cmake bison bison-devel zlib-devel libcurl-devel 
libarchive-devel boost-devel   ncurses-devel gnutls-devel libxml2-devel 
openssl-devel libevent-devel libaio-devel perl-Data-Dumper
  • 准备用户和数据目录
useradd -r -s /sbin/nologin -d /data/mysql mysql
  • 准备数据库目录
mkdir   /data/mysql
chown mysql.mysql /data/mysql
  • 编译安装说明
利用cmake编译,而利用传统方法,cmake的重要特性之一是其独立于源码(out-of-source)的编译功能,
即编译工作可以在另一个指定的目录中而非源码目录中进行,这可以保证源码目录不受任何一次编译的
影响,因此在同一个源码树上可以进行多次不同的编译,如针对于不同平台编译
#编译选项
https://dev.mysql.com/doc/refman/5.7/en/source-configuration-options.html
  • 下载并解压缩源码包
tar xvf   mysql-5.6.51.tar.gz  -C /usr/local/src
#mariadb-10.2.18.tar.gz
  • 源码编译安装 MySQL
复制代码
cd mysql-5.6.51/
cmake . \
-DCMAKE_INSTALL_PREFIX=/apps/mysql \
-DMYSQL_DATADIR=/data/mysql/ \
-DSYSCONFDIR=/etc/ \
-DMYSQL_USER=mysql \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITHOUT_MROONGA_STORAGE_ENGINE=1 \
-DWITH_DEBUG=0 \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
make && make install
#4核编译,加快速度
#make -j 4
复制代码
  • 提示:如果出错,执行rm -f CMakeCache.txt
  • 准备环境变量
echo 'PATH=/apps/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh
  • 生成数据库文件
cd /apps/mysql/
./scripts/mysql_install_db --datadir=/data/mysql/ --user=mysql
  • 准备配置文件
cp -b /apps/mysql/support-files/my-default.cnf /etc/my.cnf
#针对旧版本或mariadb-10.2.18.tar.gz 
cp /apps/mysql/support-files/my-huge.cnf   /etc/my.cnf
  • 准备启动脚本,并启动服务
cp /apps/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
service mysqld start
  • 安全初始化
mysql_secure_installation

二进制安装安装MySQL 5.7 和 MySQL8.0

  • 安装相关包
yum  -y install libaio numactl-libs
  • 用户和组
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
  • 准备程序文件
wget http://mirrors.163.com/mysql/Downloads/MySQL-5.7/mysql-5.7.31-linuxglibc2.12-x86_64.tar.gz
tar xf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz -C /usr/local
cd /usr/local/
ln -s mysql-5.7.31-linux-glibc2.12-x86_64/ mysql
chown -R root.root /usr/local/mysql/
  • 准备环境变量
echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh
  • 准备配置文件
复制代码
cp /etc/my.cnf{,.bak}
cat >/etc/my.cnf<<EOF
[mysqld]
datadir=/data/mysql
skip_name_resolve=1
socket=/data/mysql/mysql.sock        
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock
EOF
复制代码
  • 初始化数据库文件并提取root密码
复制代码
#方式1: 生成随机密码
mysqld --initialize --user=mysql --datadir=/data/mysql
grep password /data/mysql/mysql.log
awk '/temporary password/{print $NF}' /data/mysql/mysql.log

#方式2: 生成 root 空密码
mysqld --initialize-insecure --user=mysql --datadir=/data/mysql
复制代码
  • 准备服务脚本和启动
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
service mysqld start
  • 修改口令
#修改前面生成的随机密码为指定密码
mysqladmin -uroot -p'LufavlMka6,!'   password nameke
#修改前面生成的空密码为指定密码
mysqladmin -uroot   password nameke
  • 测试登录
mysql -uroot -pnameke

2. 二进制安装mariadb10.4

  • 下载
yum -y install libaio numactl-libs
cd /home/nameke/tools/ && wget
http://mirrors.dotsrc.org/mariadb//mariadb-10.4.13/bintar-linux-x86_64/mariadb-10.4.13-linux-x86_64.tar.gz tar -zxf mariadb-10.4.13-linux-x86_64.tar.gz mv mariadb-10.4.13-linux-x86_64 /usr/local/mariadb
  • 新建组及用户
groupadd mysql
useradd -s /sbin/nologin -r -g mysql mysql
  • 配置服务
cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld 
  • 新建数据目录与权限
mkdir -p /data/mariadb/
chown -R mysql. /data/mariadb
chown -R mysql:mysql /usr/local/mariadb/
  • 配置my.cnf
[mysqld]
basedir=/usr/local/mariadb/
datadir=/data/mariadb/
port=3306
pid-file=/data/mariadb/mysql.pid
socket=/tmp/mysql.sock

[mysqld_safe]
log-error=/data/mariadb/mysql.log

[client]
port=3306
socket=/tmp/mysql.sock
default-character-set=utf8
  • 数据库初始化

/usr/local/mariadb/scripts/mysql_install_db --defaults-file=/usr/local/mariadb/my.cnf --user=mysql --datadir=/data/mariadb/ --basedir=/usr/local/mariadb/
  • base目录权限切回root
cd ~
chown -R root:root /usr/local/mariadb/
  • 配置环境变量
echo "PATH=/usr/local/mariadb/bin:$PATH" >/etc/profile.d/mariadb.sh
chmod +x /etc/profile.d/mariadb.sh 
source /etc/profile.d/mariadb.sh
  • 启动与登录
/etc/init.d/mysqld start
ps -ef|grep mysql
netstat -antup|grep 3306
  • 换安全模式启动,登录改root密码
mysqld_safe --defaults-file=/usr/local/mariadb/my.cnf &

use mysql
alter user 'root'@'localhost' identified by '123456';
FLUSH PRIVILEGES; 
  • 配置安全模式,然后重启
mysql_secure_installation --basedir=/usr/local/mariadb/

3. 导入hellodb.sql生成数据库

mysql -u root -p -P 3306 -S /data/mysql3306/var/mysql.sock <workdir/hellodb_innodb.sql

(1) 在students表中,查询年龄大于25岁,且为男性的同学的名字和年龄

select Name,Age from students where Age>25 and Gender='M';

(2) 以ClassID为分组依据,显示每组的平均年龄

select ClassID,avg(age) as avg_age from students group by ClassID;

(3) 显示第2题中平均年龄大于30的分组及平均年龄

  • group by 分组统计后,改where为having
#报错sql语句
select ClassID,avg(age) as avg_age from students group by ClassID where avg_age>30;
#正确sql语句
select ClassID,avg(age) as avg_age from students group by ClassID having avg_age>30;

(4) 显示以L开头的名字的同学的信息

select * from students where Name like 'L%';

4.数据库授权magedu用户,允许192.168.1.0/24网段可以连接mysql

create database magedu default character set utf8mb4 collate utf8mb4_general_ci;
grant all privileges on magedu.* to 'magedu'@'192.168.1.0/24' identified by 'magedu' with grant option;
flush privileges;

5.主从复制及主主复制的实现

主节点配置:

  • 启用二进制日志 
[mysqld]
log_bin
  • 为当前节点设置一个全局惟一的ID号
[mysqld]
server-id=#
log-basename=master  #可选项,设置datadir中日志名称,确保不依赖主机名
说明:
server-id的取值范围
1 to 4294967295 (>= MariaDB 10.2.2),默认值为1
0 to 4294967295 (<= MariaDB 10.2.1),默认值为0,如果从节点为0,所有master都将拒绝此
slave的连接
  • 查看从二进制日志的文件和位置开始进行复制
SHOW MASTER STATUS;
  • 创建有复制权限的用户账号
GRANT REPLICATION SLAVE  ON *.* TO 'repluser'@'HOST' IDENTIFIED BY 'replpass';
#MySQL8.0 分成两步实现
mysql> create user repluser@'10.0.0.%' identified by '123456';
mysql> grant replication slave on *.* to repluser@'10.0.0.%';

从节点配置

  • 启动中继日志
[mysqld]
server_id=# #为当前节点设置一个全局惟的ID号,需与主节点不同
log-bin
read_only=ON #设置数据库只读,针对supper user无效
relay_log=relay-log #relay log的文件路径,默认值hostname-relay-bin
relay_log_index=relay-log.index  #默认值hostname-relay-bin.index
  • 使用有复制权限的用户账号连接至主服务器,并启动复制线程
CHANGE MASTER TO MASTER_HOST='masterhost', 
MASTER_USER='repluser', 
MASTER_PASSWORD='replpass', 
MASTER_LOG_FILE='mariadb-bin.xxxxxx', 
MASTER_LOG_POS=#;

START SLAVE [IO_THREAD|SQL_THREAD];
SHOW SLAVE STATUS;

 

6.xtrabackup实现全量+增量+binlog恢复库

1、备份过程
1)完全备份56.11
[root@centos8 ~]#yum -y install percona-xtrabackup-24-2.4.20-1.el8.x86_64.rpm
[root@centos8 ~]#mkdir /backup/
[root@centos8 ~]#xtrabackup -uroot -pmagedu --backup --target-dir=/backup/base
2)第一次修改数据

3)第一次增量备份
[root@centos8 ~]#xtrabackup -uroot -pmagedu --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base
4)第二次修改数据

5)第二次增量备份
[root@centos8 ~]#xtrabackup -uroot -pmagedu --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1
6)同步到远程数据库机器上
[root@centos8 ~]#scp -r /backup/* 目标主机:/backup/ #备份过程生成三个备份目录 /backup/{base,inc1,inc2} 2、还原过程:56.37 1)预准备完成备份,此选项--apply-log-only 阻止回滚未完成的事务 [root@c8-client01 ~]#yum -y install percona-xtrabackup-24-2.4.20-1.el8.x86_64.rpm [root@c8-client01 ~]#xtrabackup --prepare --apply-log-only --target-dir=/backup/base 2)合并第1次增量备份到完全备份 [root@c8-client01 ~]#xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1 3)合并第2次增量备份到完全备份:最后一次还原不需要加选项--apply-log-only [root@c8-client01 ~]#xtrabackup --prepare --target-dir=/backup/base --incrementaldir=/backup/inc2 4)复制到数据库目录
#
注意数据库目录必须为空,MySQL服务不能启动 [root@c8-client01 ~]#xtrabackup --copy-back --target-dir=/backup/base 5)还原权限属性: [root@c8-client01 ~]#chown -R mysql:mysql /var/lib/mysql 6)启动服务: [root@c8-client01 ~]#systemctl start mysql3306.service

7.MyCAT实现MySQL读写分离

案例:利用 Mycat 实现 MySQL 的读写分离

环境要求

#所有主机的系统版本: 
cat /etc/centos-release
CentOS Linux release 8.0.1905 (Core)  
#服务器共三台 
mycat-server 192.168.56.12 #内存建议2G以上
mysql-master 192.168.56.11 MySQL 8.0 或者Mariadb 10.3.17
mysql-slave  192.168.56.13   MySQL 8.0 或者Mariadb 10.3.17 

关闭SELinux和防火墙 

systemctl stop firewalld
setenforce 0
时间同步

1、创建 MySQL 主从数据库

yum -y install mysql-server
#或者
yum -y install mariadb-server
  • 1) 修改master和slave上的配置文件
#master1上的my.cnf
[root@master1 ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id = 11
log-bin
#slave1上的my.cnf [mysqld] server-id = 13
systemctl start mariadb
  • 2) Master1上创建复制用户 
mysql -uroot -p
#登录数据库后执行如下操作
GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.56.%' IDENTIFIED BY 'replpass';
FLUSH PRIVILEGES;    
show master status;
  • 3) Slave1上执行
mysql -uroot -p
#登录数据库后执行如下操作
CHANGE MASTER TO
MASTER_HOST='192.168.56.%',
MASTER_USER='repluser',
MASTER_PASSWORD='replpass',
MASTER_LOG_FILE='mariadb-bin.000001',
MASTER_LOG_POS=403;

start slave;
show slave status\G;

2、在MySQL代理服务器192.168.56.12安装mycat并启动

#确认安装并成功
yum -y install java
java -version #下载并安装 wget -c http://dl.mycat.org.cn/1.6.7.6/20210303094759/Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz #wget -c http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz mkdir /apps && tar xvf Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz -C /apps/ #mkdir /apps && tar xvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /apps/ #配置环境变量 echo 'PATH=/apps/mycat/bin:$PATH' >/etc/profile.d/mycat.shsource /etc/profile.d/mycat.sh #查看端口 ss -ntl #启动mycat file /apps/mycat/bin/mycat mycat start
#注意: 此步启动较慢,需要等一会儿,另外如果内存太小,会导致无法启动 #可以看到打开多个端口,其中8066端口用于连接MyCAT ss -ntlp #查看日志,确定成功,可能需要等一会儿才能看到成功的提示 tail -f /apps/mycat/logs/wrapper.log #用默认密码123456来连接mycat mysql -uroot -pzhongguo -h 192.168.56.12 -P8066

4、在mycat 服务器上修改server.xml文件配置Mycat的连接信息

[root@mysql-proxy ~]#vim /apps/mycat/conf/server.xml
...省略...
#修改下面行的8066改为3306复制到到独立非注释行
<property name="serverPort">3306</property>
<property name="handlelDistributedTransactions">0</property> #将上面行放在此行前面
#或者删除注释,并修改下面行的8066改为3306
<property name="serverPort">3306</property>
<property name="managerPort">9066</property>
<property name="idleTimeout">300000</property>
<property name="authTimeout">15000</property>
<property name="bindIp">0.0.0.0</property>
<property name="dataNodeIdleCheckPeriod">300000</property> #5 * 60 * 1000L; //连接空闲检查 删除#后面此部分
<property name="frontWriteQueueSize">4096</property> <property 
name="processors">32</property> #--> 删除#后面此部分
 .....
<user name="root">                                       #连接Mycat的用户名
   <property name="password">zhongguo</property>          #连接Mycat的密码
   <property name="schemas">TESTDB</property>           #数据库名要和schema.xml相
对应
</user>
</mycat:server>
  • 这里使用的是root,密码为magedu,逻辑数据库为TESTDB,这些信息都可以自己随意定义,读写权限都有,没有针对表做任何特殊的权限。重点关注上面这段配置,其他默认即可

5、修改schema.xml实现读写分离策略

[root@mysql-proxy ~]#vim /apps/mycat/conf/schema.xml 
#最终文件内容
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
 <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"
dataNode="dn1">
 </schema>
 <dataNode name="dn1" dataHost="localhost1" database="hellodb" />
 <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
  writeType="0" dbType="mysql" dbDriver="native" switchType="1"
slaveThreshold="100">
 <heartbeat>select user()</heartbeat>
 <writeHost host="host1" url="192.168.56.11:3306" user="root" password="zhongguo"><readHost host="host2" url="192.168.56.13:3306" user="root" password="zhongguo" />
 </writeHost>
   </dataHost>
</mycat:schema>
#重新启动mycat
[root@mysql-proxy ~]#mycat restart
#以上***部分表示原配置文件中需要修改的内容,注意大小写
  • 上面配置中,balance改为1,表示读写分离
  • 注意:要保证能使用root/123456权限成功登录10.0.0.18和10.0.0.28机器上面的mysql数据库。同时,也一定要授权mycat机器能使用root/123456权限成功登录这两台机器的mysql数据库!!这很重要,否则会导致登录mycat后,对库和表操作失败!

6、在后端主服务器创建用户并对mycat授权

[root@master1 ~]#mysql -uroot -p
create database mycat;
GRANT ALL ON *.* TO 'root'@'192.168.56.%' IDENTIFIED BY 'zhongguo' ;
flush privileg

7、在Mycat服务器上连接并测试

[root@mysql-proxy ~]#mysql -uroot -pzhongguo -h127.0.0.1 TESTDB
#登录数据库后执行
show databases;
use TESTDB;
create table t1(id int);
select @@server_id;
select @@hostname;

8、通过通用日志确认实现读写分离

  • 在mysql中查看通用日志 
show variables like 'general_log';  #查看日志是否开启
set global general_log=on;    #开启日志功能
show variables like 'general_log_file'; #查看日志文件保存位置
set global general_log_file='tmp/general.log'; #设置日志文件保存位置
  • 在主和从服务器分别启用通用日志,查看读写分离
[root@master1 ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
general_log=ON
[root@master1 ~]#systemctl restart mariadb
[root@master1 ~]#tail -f /var/lib/mysql/centos8.log

9、停止从节点,MyCAT自动调度读请求至主节点 

[root@slave1 ~]#systemctl stop mariadb
[root@client ~]#mysql -uroot -pzhongguo-h192.168.56.12 -P8066

select @@server_id;
#停止主节点,MyCAT不会自动调度写请求至从节点
insert teachers values(5,'wang',30,'M');

10、MyCAT对后端服务器的健康性检查方法select user()

#开启通用日志
[root@master1 ~]#mysql
set global general_log=1;
[root@slave1 ~]#mysql
set global general_log=1;

#查看通用日志 tail -f /var/lib/mysql/master.log tail -f /var/lib/mysql/slave.log

 

posted @ 2022-06-22 22:31  西瓜的春天  阅读(26)  评论(0)    收藏  举报