mysql

mysql

文章目录

数据管理的三个阶段

  • 人工管理阶段:外部存储设备只有磁带等,数据处理方式上基本是批处理。
  • 文件系统管理阶段:在硬件方面,出现了磁盘和基于文件系统的数据管理软件。数据可 以在系统中长期保存。文件也有了各种各样的格式。在数据处理方式上可以批处理,也可以联机实时处理。应用程序对接不方便,没有统一接口,数据冗余不可避免。
  • 数据库系统阶段:提供了对数据更高级、更有效的管理。数据库系统采用了复杂的结构化的数据模型,数据拥有高独立性,低冗余度。

数据库管理系统相关概念

  • 数据库:Database,按照一定的数据结构来组织,存储和管理数据的仓库。
  • 数据库管理系统:Database Management System(DBMS),操纵和管理数据库的大型软件,用于建立,使用和维护数据库,对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。
  • 数据库管理员:Database Administrator(DBA),从事管理和维护数据库管理系统(DBMS)的相关工作人员,负责业务数据库从设计、测试到部署交付的全生命周期管理。保证数据库管理系统的稳定性、安全性、完整性和高可用性能。
  • 应用程序:Application,能够执行某种功能的软件程序。

数据库管理系统特点

  • 数据库管理系统中采用了复杂的数据模型表示数据结构,数据冗余小,易扩充,实现了数据共享。
  • 具有较高的数据和程序独立性。数据库的独立性表现在物理独立性和逻辑独立性两个方面。
  • 数据库管理系统为用户和应用程序提供了方便和统一的查询接口。
  • 数据库管理系统的存在,使得数据可以和应用程序解耦。
  • 数据库管理系统还具有并发控制,数据备份和恢复,完整性和安全性保障等功能。

SQL结构化查询语言

  • StructureQueryLanguage,结构化查询语言。是一种数据库查询和程序设计语言,用于存取数 据以及查询、更新和管理关系数据库系统,SQL语句就是用SQL语言写的用于操作数据库的语句。
  • 关系型数据库一般工作于C/S模式下,使用专有协议进行通信,服务端程序监听特有端口,客户端程序发 送查询语句到服务端,服务端将查询结果返回给客户端。

windows安装

  1. 安装过程:设置mysql数据路径时不要有中文字符。

  2. windows administrator cmd:net start MySQL84

bash 复制代码
#属性>高级系统设置>高级>环境变量
#新建系统Path:C:\Program Files\MySQL\MySQL Server 8.4\bin
#关闭两端防火墙
mysql -uroot -p '密码'

ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

linux安装

bash 复制代码
#查看CentOS Stream 8自带yum源支持的MySQL版本信息
[root@localhost ~]# dnf list mysql-server*

[root@localhost ~]# dnf install -y mysql-server-8.0.26

[root@localhost ~]# systemctl enable mysqld --now

[root@localhost ~]# ss -nlp | grep 3306

#初始化
[root@localhost ~]# mysql
mysql> ALTER USER root@'localhost' IDENTIFIED BY 'Huawei@123';
Query OK, 0 rows affected (0.01 sec)

#修改完成后,退出MySQL,然后重新使用root账户登录
[root@localhost ~]# mysql -uroot -p'Huawei@123'
mysql> SHOW DATABASES;

#安装完成后拍摄快照

相关命令

bash 复制代码
#查看所有客户端命令
mysql> ?

#查看所有服务端命令
mysql> help contents

#免密登录
[root@localhost ~]# mysql -uroot -pHuawei@123

#将mysql root账号密码设置为空
mysql> alter user root@localhost identified by '';
#退出mysql
mysql> quit                                 

#显示版本
[root@localhost ~]# mysql -V

#指定用户名,主机,端口
[root@localhost ~]# mysql -uroot -h127.0.0.1 -P3306

#默认使用root连接,密码为空
[root@localhost ~]# mysql

#执行完退出,非交互式执行
#环境准备
[root@localhost ~]# vim /root/test.sql
show databases;

#执行客户端命令
[root@localhost ~]# mysql -e "source /root/test.sql"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql             |
| performance_schema |
| sys               |
+--------------------+

#管道执行
[root@localhost ~]# cat test.sql | mysql
Database
information_schema
mysql
performance_schema
sys

#标准输入重定向执行
[root@localhost ~]# mysql -uroot < test.sql
Database
information_schema
mysql
performance_schema
sys

#以table格式输出
[root@localhost ~]# mysql -e "show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql             |
| performance_schema |
| sys               |
+--------------------+

#修改提示符
[root@localhost ~]# mysql --prompt=[test]
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
[test]

源码安装mysql

bash 复制代码
#CentOS-7-template模板克隆mysql01
#设置主机名
[root@localhost ~]# hostnamectl set-hostname mysql01
#关闭防火墙
[root@mysql01 ~]# systemctl disable firewalld.service --now

#mysql5.7稳定版安装
#安装依赖包,ncurses(基础运行时库) ncurses-devel(可操作终端)bison(解析语法) cmake(源码编译工具) gcc,gcc-c++(编译器)

[root@mysql01 ~]# yum -y install ncurses ncurses-devel bison cmake gcc gcc-c++

#配置程序用户(不允许终端登录)
[root@mysql01 ~]# useradd -s /sbin/nologin mysql

#解压mysql和boost包到指定目录,boost是支持mysql底层c++运行的仓库
[root@mysql01 ~]# tar zxvf mysql-5.7.17.tar.gz -C /opt/
[root@mysql01 ~]# tar zxvf boost_1_59_0.tar.gz -C /usr/local/
[root@mysql01 ~]# cd /usr/local/
[root@mysql01 ~]# mv boost_1_59_0 boost

#配置安装环境
[root@mysql01 ~]# cd /opt/mysql-5.7.17/
[root@mysql01 mysql-5.7.17]# cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=/usr/local/boost \
-DWITH_SYSTEMD=1

#注释 
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #安装路径
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \ #客户端连服务的通讯文件
-DSYSCONFDIR=/etc \ #mysql的配置文件
-DSYSTEMD_PID_DIR=/usr/local/mysql \ #pid进程文件存放位置
-DDEFAULT_CHARSET=utf8 \ #字符集格式
-DDEFAULT_COLLATION=utf8_general_ci \ #字符集位置
-DWITH_INNOBASE_STORAGE_ENGINE=1 \ #开启支持的存储引擎
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \  #数据存放位置
-DWITH_BOOST=/usr/local/boost \ #底层的c++支持库位置
-DWITH_SYSTEMD=1 #id号
#注意:如果在CMAKE的过程中有报错,当报错解决后,需要把源码目录中的CMakeCache.txt文件删除,然后再重新CMAKE

#编译和安装
[root@mysql01 mysql-5.7.17]# make && make install

#递归配置目录所属主和组
[root@mysql01 ~]# chown -R mysql.mysql /usr/local/mysql/

#编辑mysql的配置文件,直接全替换 
[root@mysql01 ~]# vim /etc/my.cnf
[client]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
[mysql]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_V
ALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CON
CAT,ANSI_QUOTES

#配置文件所属主和组
[root@mysql01 ~]# chown mysql:mysql /etc/my.cnf

#配置环境变量
[root@mysql01 ~]# echo 'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile
[root@mysql01 ~]# echo 'export PATH' >> /etc/profile

#加载修改过的配置
[root@mysql01 ~]# source /etc/profile

#数据库初始化
[root@mysql01 ~]# cd /usr/local/mysql/
[root@mysql01 mysql]# bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data

[root@mysql01 mysql]# cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
[root@mysql01 mysql]# systemctl daemon-reload
[root@mysql01 mysql]# systemctl start mysqld
[root@mysql01 mysql]# netstat -anpt | grep 3306
[root@mysql01 mysql]# systemctl enable mysqld
#给root账号设置密码为huawei,提示输入的是原始密码(密码为空)。
[root@mysql01 mysql]# mysqladmin -uroot -p password "huawei"
Enter password:

#登录mysql
[root@mysql01 ~]# mysql -uroot -phuawei
#授权远程登录
mysql> grant all privileges on *.* to 'root'@'%' identified by 'huawei' with grant option;

#拍摄快照

python 导出表

bash 复制代码
#配置pip源,Windows系统在用户目录下(如 C:\Users\你的用户名\)创建一个名为 pip 的文件夹。
#用记事本打开 pip.ini,输入以下内容并保存:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn

#pycharm下载软件包
pip install pandas
pip install sqlalchemy
pip install pymysql
pip install openpyxl

#添加代码并执行
import pandas as pd
from sqlalchemy import create_engine
#创建数据连接
engine = create_engine('mysql+pymysql://root:huawei@192.168.108.142:3306/school')
#执行获取数据
df = pd.read_sql('select * from info', engine)
print(df)
#导出到excel表格
df.to_excel('info.xlsx', index=False)
print('excel 导出成功!')

#根据项目位置找到输出的excel

mysql的备份与恢复

冷备份
bash 复制代码
[root@mysql01 ~]# systemctl stop mysqld       
[root@mysql01 ~]# cd /usr/local/mysql/data
[root@mysql01 data]# mkdir /mysql_bak
[root@mysql01 data]# tar czf /mysql_bak/mysql-backup-$(date +%F).tar.gz *
[root@mysql01 data]# systemctl start mysqld 
#测试服务正常

#删除数据
[root@mysql01 ~]# systemctl stop mysqld # 先停止服务
[root@mysql01 ~]# rm -rf /usr/local/mysql/data/*
[root@mysql01 ~]# systemctl start mysqld
#进入数据库失败
#停止数据库,恢复数据库
[root@mysql01 ~]# systemctl stop mysqld
[root@mysql01 ~]# tar xzf /mysql_bak/mysql-backup-2025-10-15.tar.gz -C /usr/local/mysql/data/
[root@mysql01 ~]# chown -R mysql:mysql /usr/local/mysql/data
[root@mysql01 ~]# systemctl start mysqld     
逻辑备份
bash 复制代码
#备份数据库
[root@mysql01 ~]# systemctl start mysqld
[root@mysql01 ~]# mysqldump -u root -p school > /mysql_bak/school.sql
Enter password:
[root@mysql01 ~]# ls /mysql_bak/school.sql
mysql_bak/school.sql
[root@mysql01 ~]# cat /mysql_bak/school.sql
#备份多个数据库
[root@mysql01 ~]# mysqldump -u root -p --databases school mysql > /mysql_bak/school-mysql.sql
Enter password:
[root@mysql01 ~]# cat /mysql_bak/school-mysql.sql
#备份所有数据库
[root@mysql01 ~]# mysqldump -u root -p --opt --all-databases > /mysql_bak/all.sql
Enter password:
[root@mysql01 ~]# cat /mysql_bak/all.sql 
#备份整个表
[root@mysql01 ~]# mysqldump -u root -p school info > /mysql_bak/info.sql
Enter password:
[root@mysql01 ~]# cat /mysql_bak/info.sql

#恢复数据
[root@mysql01 ~]# mysql -u root -p
Enter password:
mysql> use school
mysql> show tables;
mysql> drop table info;
Query OK, 0 rows affected (0.01 sec)
mysql> source /mysql_bak/info.sql
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| info             |
+------------------+
1 row in set (0.00 sec)
增量备份
bash 复制代码
[root@mysql01 ~]# vim /etc/my.cnf
#这段下面最后加一行
[mysqld]
log-bin=mysql-bin 
[root@web-server ~]# systemctl restart mysqld.service
[root@mysql01 ~]# ls /usr/local/mysql/data/
     
#先进行完整性备份
[root@mysql01 ~]# mysqldump -uroot -p school > /opt/school.sql
Enter password:
#日志刷新生效
[root@mysql01 ~]# mysqladmin -uroot -p flush-logs
Enter password:
#新产生的mysql-bin.000002只记录上次刷新后的操作
[root@mysql01 ~]# ls /usr/local/mysql/data/

[root@mysql01 ~]# mysql -uroot -p
Enter password:
mysql> use school;
mysql> select * from info;
#再次插入数据生产增量备份
mysql> insert into info (name,score,address,hobby) values ('美猴王',75,'武汉',1);
Query OK, 1 row affected (0.00 sec)
mysql> exit
[root@mysql01 ~]# mysqladmin -uroot -p flush-log
Enter password:
#新产生mysql-bin.000003日志记录insert操作
[root@mysql01 ~]# ls /usr/local/mysql/data/

[root@mysql01 ~]# mysql -uroot -p
Enter password:
mysql> use school;
Database changed
mysql> insert into info (name,score,address,hobby) values ('超人',83,'上海',2);
Query OK, 1 row affected (0.00 sec)
mysql> select * from info;
#刷新日志生效
[root@mysql01 ~]# mysqladmin -uroot -p flush-log
Enter password:
#环境准备
[root@mysql01 ~]# mysql -uroot -p
Enter password:
mysql> use school;
#删除内容
mysql> delete from info where id=6;
Query OK, 1 row affected (0.00 sec)
mysql> delete from info where id=5;
Query OK, 1 row affected (0.01 sec)
mysql> select * from info;
[root@mysql01 ~]# ls /usr/local/mysql/data/
#查看日志文件,vim看日志是乱码
[root@mysql01 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000003
[root@mysql01 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000004

#恢复操作,恢复时如果被拒绝,是有其他mysql进程占用了
[root@mysql01 ~]# mysqlbinlog --no-defaults /usr/local/mysql/data/mysqlbin.000003 | mysql -uroot -p
Enter password:
#验证
[root@web-server ~]# mysql -uroot -p
Enter password:
mysql> select * from info;

主从复制和读写分离

作用:数据冗余和灾难恢复;提升并发能力、避免锁冲突。

实验准备:使用centos模板克隆产生应用客户端和amoeba,使用mysql模板克隆产生mysql主服务器,mysql从节点1,mysql从节点2。

bash 复制代码
#mysql-master 192.168.108.101 mysql主服务器
#mysql-slave01 192.168.108.102 mysql从节点1
#mysql-slave02 192.168.108.103 mysql从节点2
#amoeba 192.168.108.110 amoeba
#mysql-client 192.168.108.111 应用客户端

#ip和hostname配置模板
nmcli connection modify ens33 ipv4.addresses 192.168.108.111/24 ipv4.method manual ipv4.gateway 192.168.108.2 ipv4.dns 192.168.108.2

nmcli connection up ens33

hostnamectl set-hostname mysql-client

#所有节点时间同步
ntpdate ntp1.aliyun.com
date -R
systemctl disable firewalld --now
setenforce 0

#若对时完成后,无法重启mysqld服务,因为在windows端使用navicat连接过mysql,可用pkill -9 mysql;systemctl restart mysqld解决

mysql主从服务器配置

bash 复制代码
#mysql主服务器
[root@mysql-master ~]# vim /etc/my.cnf
server-id = 11
log-bin = master-bin                         #主服务器日志文件
log-slave-updates = true                     #从服务器更新二进制日志

[root@mysql-master ~]# systemctl restart mysqld
[root@mysql-master ~]# mysql -u root -p
Enter password:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.108.%' IDENTIFIED BY 
'123456';
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql> show master status;
#检查有没有master-bin.000001
[root@mysql-master ~]# ls /usr/local/mysql/data

#mysql从服务器

#主从是克隆的要做这个操作,否则UUID一致
[root@mysql-slave01 ~]# systemctl stop mysqld
[root@mysql-slave01 ~]# rm -f /usr/local/mysql/data/auto.cnf
[root@mysql-slave01 ~]# systemctl start mysqld

[root@mysql-slave01 ~]# vim /etc/my.cnf
server-id = 22                                     #另外一台为23
relay-log = relay-log-bin                          #从主服务器上同步日志文件记录到本地
relay-log-index = slave-relay-bin.index           #定义relay-log的位置和名称

[root@mysql-slave01 ~]# systemctl restart mysqld

[root@mysql-slave01 ~]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.17 Source distribution

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> change master to master_host='192.168.108.101',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=604;              #master_log_file,master_log_pos与前面查询的相同
Query OK, 0 rows affected, 2 warnings (0.03 sec)

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

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.108.101
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 604
               Relay_Log_File: relay-log-bin.000002
                Relay_Log_Pos: 321
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes                  #Yes
            Slave_SQL_Running: Yes                  #Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 604
              Relay_Log_Space: 526
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 11
                  Master_UUID: 5d895caf-a1e0-11f0-b3ec-000c29866c0f
             Master_Info_File: /usr/local/mysql/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)

ERROR:
No query specified

#mysql-slave02
[root@mysql-slave02 ~]# systemctl stop mysqld
[root@mysql-slave02 ~]# rm -f /usr/local/mysql/data/auto.cnf
[root@mysql-slave02 ~]# systemctl start mysqld

[root@mysql-slave02 ~]# vim /etc/my.cnf
server-id = 23
relay-log = relay-log-bin                         
relay-log-index = slave-relay-bin.index

[root@mysql-slave02 ~]# systemctl restart mysqld

[root@mysql-slave02 ~]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.17 Source distribution

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> change master to master_host='192.168.108.101',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=604;
Query OK, 0 rows affected, 2 warnings (0.04 sec)

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

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.108.101
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 604
               Relay_Log_File: relay-log-bin.000002
                Relay_Log_Pos: 321
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 604
              Relay_Log_Space: 526
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 11
                  Master_UUID: 5d895caf-a1e0-11f0-b3ec-000c29866c0f
             Master_Info_File: /usr/local/mysql/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)

ERROR:
No query specified

验证主从同步

bash 复制代码
# 主服务器上:
[root@mysql-master ~]# mysql -uroot -phuawei
mysql> create database school;
Query OK, 1 row affected (0.01 sec)
mysql> use school;

CREATE TABLE student (
id int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
age tinyint UNSIGNED,
#height DECIMAL(5,2),
gender ENUM('M','F') default 'M'
)ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4;

mysql> insert student (name,age)values('路飞',20);

# 去从服务器上 show databases;
[root@mysql-slave01 ~]# mysql -uroot -phuawei
mysql> select * from school.student;

amoeba服务器

bash 复制代码
#普通linux克隆
[root@amoeba ~]# hostnamectl set-hostname amoeba
[root@amoeba ~]# systemctl stop firewalld.service
[root@amoeba ~]# setenforce 0

[root@amoeba ~]# chmod +x jdk-6u14-linux-x64.bin
[root@amoeba ~]# ./jdk-6u14-linux-x64.bin
到yes的时候,输入yes按enter

[root@amoeba ~]# mv jdk1.6.0_14/ /usr/local/jdk1.6

[root@amoeba ~]# vim /etc/profile
最下面加
export JAVA_HOME=/usr/local/jdk1.6                   #java家目录
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib             #类环境和jre
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin          
export AMOEBA_HOME=/usr/local/amoeba                  #指定amoeba路径
export PATH=$PATH:$AMOEBA_HOME/bin

[root@amoeba ~]# source /etc/profile

[root@amoeba ~]# mkdir /usr/local/amoeba

[root@amoeba ~]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/

[root@amoeba ~]# chmod -R 755 /usr/local/amoeba/

#执行结果显示amoeba start|stop说明安装成功
[root@amoeba ~]# /usr/local/amoeba/bin/amoeba
amoeba start|stop

#在三台mysql上添加权限开放给amoeba访问

#amooba访问数据库的账号 
#mysql-master
mysql> grant all on *.* to test@'192.168.108.%' identified by '123.com';

#mysql-slave01
mysql> grant all on *.* to test@'192.168.108.%' identified by '123.com';

#mysql-slave02
mysql> grant all on *.* to test@'192.168.108.%' identified by '123.com';

#回到amoeba服务器

[root@amoeba ~]# cd /usr/local/amoeba/
[root@amoeba amoeba]# vim conf/amoeba.xml
---30行--
 <property name="user">amoeba</property           #客户端访问amoeba账号
----32行---------
 <property name="password">123456</property>        #客户端访问ameoba密码

---117和120-去掉注释-
 115行 <property name="defaultPool">master</property>
 116
 117
 118行<property name="writePool">master</property>
 119行<property name="readPool">slaves</property>
 120

[root@amoeba amoeba]# vim conf/dbServers.xml         #数据库配置
---23--注意!!!(mysql5.7,默认没有test数据库所以需要修改为mysql数据库)-(mysql5.5直接忽略)--
<!-- mysql schema -->
<property name="schema">mysql</property>

--25行到30行,第30行-->移动到28行后面
 25                         <!-- mysql user -->
 26                         <property name="user">test</property>
 27
 28                         <!--  mysql password -->
 29                         <property name="password">123.com</property>
 30

-----45到50行主服务器地址---
45行<dbServer name="master"  parent="abstractServer">
48行<property name="ipAddress">192.168.108.101</property>
--52到57行从服务器主机名-
52行<dbServer name="slave1"  parent="abstractServer">
--55-从服务器地址-
55 <property name="ipAddress">192.168.108.102</property>
 ---52到57行复制一份在58行后面
原52行<dbServer name="slave2"  parent="abstractServer">
--55-从服务器地址-
原55 <property name="ipAddress">192.168.108.103</property>
 
 ---仅跟在上面的配置后面,multiPool行(本来就有,修改)
 <dbServer name="slaves" virtual="true">
 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool   #不改

<property name="poolNames">slave1,slave2</property>
 </poolConfig>           #不改

[root@amoeba ~]# /usr/local/amoeba/bin/amoeba start&
[1] 33499

[root@amoeba ~]# netstat -anpt | grep java
tcp6       0      0 :::8066                 :::*                    LISTEN      33499/java
tcp6       0      0 127.0.0.1:21128         :::*                    LISTEN      33499/java
tcp6       0      0 192.168.108.110:41754   192.168.108.101:3306    ESTABLISHED 33499/java
tcp6       0      0 192.168.108.110:41722   192.168.108.102:3306    ESTABLISHED 33499/java
tcp6       0      0 192.168.108.110:36956   192.168.108.103:3306    ESTABLISHED 33499/java

测试客户端

bash 复制代码
[root@mysql-client ~]# yum install -y mysql
[root@mysql-client ~]# mysql -u amoeba -p123456 -h 192.168.108.110 -P8066     #连接amoeba服务器,8086端口在amoeba上执行netstat -anpt|grep java看
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 927449563
Server version: 5.1.45-mysql-amoeba-proxy-2.2.0

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>

#在MASTER表中添加信息从节点会跟着修改

#停止slave后在在客户端上插入数据,内容不会同步

#在客户端上测试,第一次会向从服务器1读数,据-第二次会向从2读取

#都是从从节点读取的,读写分离,由实验结果可知:客户端的读取内容会从mysql-slave01和mysql-slave02上轮询得到。

MHA高可用

bash 复制代码
#配置主从数据库后

#安装 MHA 依赖的环境,首先安装 epel 源。

# yum install epel-release --nogpgcheck -y

yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN

#mysql-master
[root@mysql-master ~]# tar zxvf mha4mysql-node-0.57.tar.gz
[root@mysql-master ~]# cd mha4mysql-node-0.57
[root@mysql-master ~]# perl Makefile.PL
[root@mysql-master ~]# make
[root@mysql-master ~]# make install

#mysql-slave01
[root@mysql-slave01 ~]# tar zxvf mha4mysql-node-0.57.tar.gz
[root@mysql-slave01 ~]# cd mha4mysql-node-0.57
[root@mysql-slave01 ~]# perl Makefile.PL
[root@mysql-slave01 ~]# make
[root@mysql-slave01 ~]# make install

#mysql-slave02
[root@mysql-slave02 ~]# tar zxvf mha4mysql-node-0.57.tar.gz
[root@mysql-slave02 ~]# cd mha4mysql-node-0.57
[root@mysql-slave02 ~]# perl Makefile.PL
[root@mysql-slave02 ~]# make
[root@mysql-slave02 ~]# make install

#mha
[root@mha ~]# tar zxvf mha4mysql-node-0.57.tar.gz
[root@mha ~]# cd mha4mysql-node-0.57
[root@mha ~]# perl Makefile.PL
[root@mha ~]# make
[root@mha ~]# make install

#mha
[root@mha ~]# tar zxvf mha4mysql-manager-0.57.tar.gz
[root@mha ~]# cd mha4mysql-manager-0.57
[root@mha mha4mysql-manager-0.57]# perl Makefile.PL
[root@mha mha4mysql-manager-0.57]# make
[root@mha mha4mysql-manager-0.57]# make install

#配置无密码认证

#在 manager 上配置到所有数据库节点的无密码认证
[root@mha ~]# ssh-keygen -t rsa             #一路按回车键
[root@mha ~]# ssh-copy-id 192.168.108.131
[root@mha ~]# ssh-copy-id 192.168.108.132
[root@mha ~]# ssh-copy-id 192.168.108.133

#在 mysql-master 上配置到数据库节点mysql-slave01和mysql-slave02的无密码认证
[root@mysql-master ~]# ssh-keygen -t rsa
[root@mysql-master ~]# ssh-copy-id 192.168.108.132
[root@mysql-master ~]# ssh-copy-id 192.168.108.133

#在 mysql-slave01 上配置到数据库节点mysql-master和mysql-slave02的无密码认证
[root@mysql-slave01 ~]# ssh-keygen -t rsa
[root@mysql-slave01 ~]# ssh-copy-id 192.168.108.131
[root@mysql-slave01 ~]# ssh-copy-id 192.168.108.133

#在 mysql-slave02 上配置到数据库节点mysql-master和mysql-slave01的无密码认证
[root@mysql-slave02 ~]# ssh-keygen -t rsa
[root@mysql-slave02 ~]# ssh-copy-id 192.168.108.131
[root@mysql-slave02 ~]# ssh-copy-id 192.168.108.132

配置 MHA

bash 复制代码
[root@mha ~]# cp -ra /root/mha4mysql-manager-0.57/samples/scripts /usr/local/bin

#拷贝后会有四个执行文件
[root@mha ~]# ll /usr/local/bin/scripts/
总用量 32
-rwxr-xr-x 1 mysql mysql 3648 5 月 31 2015 master_ip_failover  #自动切换时 VIP 管理的脚本
-rwxr-xr-x 1 mysql mysql 9872 5 月 25 09:07 master_ip_online_change #在线切换时 vip 的管理
-rwxr-xr-x 1 mysql mysql 11867 5 月 31 2015 power_manager #故障发生后关闭主机的脚本
-rwxr-xr-x 1 mysql mysql 1360 5 月 31 2015 send_report #因故障切换后发送报警的脚本

[root@mha ~]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin

#复制时,#号间一段段复制
[root@mha ~]# vim /usr/local/bin/master_ip_failover
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';

use Getopt::Long;

my (
$command, $ssh_user, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);
#############################添加内容部分#########################################
my $vip = '192.168.108.200';
my $brdc = '192.168.108.255';
my $ifdev = 'ens33';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
my $exit_code = 0;
#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
#my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
##################################################################################
GetOptions(
'command=s' => \$command,
'ssh_user=s' => \$ssh_user,
'orig_master_host=s' => \$orig_master_host,
'orig_master_ip=s' => \$orig_master_ip,
'orig_master_port=i' => \$orig_master_port,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
);

exit &main();

sub main {

print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";

if ( $command eq "stop" || $command eq "stopssh" ) {

my $exit_code = 1;
eval {
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if ($@) {
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {

my $exit_code = 10;
eval {
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
$exit_code = 0;
};
if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
exit 0;
}
else {
&usage();
exit 1;
}
}
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
# A simple system call that disable the VIP on the old_master
sub stop_vip() {
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}

sub usage {
print
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}

#创建 MHA 软件目录并拷贝配置文件。
[root@mha ~]# mkdir /etc/masterha
[root@mha ~]# cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/
[root@mha ~]# vim /etc/masterha/app1.cnf
#全部删掉,替换
[server default]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/usr/local/mysql/data
#master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
password=manager
ping_interval=1
remote_workdir=/tmp
repl_password=123
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.108.132 -s 192.168.108.133
shutdown_script=""
ssh_user=root
user=mha

[server1]
hostname=192.168.108.131
port=3306

[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.108.132
port=3306

[server3]
hostname=192.168.108.133
port=3306

#验证配置
#检测SSH无密码认证
[root@mha ~]# masterha_check_ssh -conf=/etc/masterha/app1.cnf

#检测下主从复制
[root@mha ~]# masterha_check_repl -conf=/etc/masterha/app1.cnf

##注意:第一次配置需要去master上手动开启虚拟IP
[root@mysql-master ~]# /sbin/ifconfig ens33:1 192.168.108.200/24

启动 MHA

bash 复制代码
[root@mha ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &

[root@mha ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:48240) is running(0:PING_OK), master:192.168.108.131

#查看 MHA 日志,也以看到当前的 master 是 192.168.108.131

[root@mha ~]# cat /var/log/masterha/app1/manager.log

#mysql-master 的 VIP 地址 192.168.108.200不会因为manager 节点停止 MHA 服务而消失。
[root@mysql-master ~]# ifconfig

#验证
#mha节点A窗口操作
[root@mha ~]# tailf /var/log/masterha/app1/manager.log     //启用监控观察日志记录

#mysql-master节点操作
[root@mysql-master ~]# pkill -9 mysql         //查看master变化,看上面命令的日志

#回到mha节点A窗口观察日志
[root@mha ~]# tailf /var/log/masterha/app1/manager.log

故障模拟

bash 复制代码
# master 停止mysql观察现象
[root@mysql-master ~]# systemctl stop mysqld   
# master切换成功

#恢复
[root@mysql-master ~]# systemctl start mysqld
# mysql-slave01
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000002 |     2210 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

# mysql-master操作
mysql> change master to master_host='192.168.108.132',master_user='myslave',master_password='123',master_log_file='master-bin.000002',master_log_pos=2210;       #这里的master_log_pos写mysq_slave01的
mysql> start slave;
......

/var/log/masterha/app1/manager.log //启用监控观察日志记录

#mysql-master节点操作

root@mysql-master \~\]# pkill -9 mysql //查看master变化,看上面命令的日志 #回到mha节点A窗口观察日志 \[root@mha \~\]# tailf /var/log/masterha/app1/manager.log ### 故障模拟 ```bash # master 停止mysql观察现象 [root@mysql-master ~]# systemctl stop mysqld # master切换成功 #恢复 [root@mysql-master ~]# systemctl start mysqld # mysql-slave01 mysql> show master status; +-------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-------------------+----------+--------------+------------------+-------------------+ | master-bin.000002 | 2210 | | | | +-------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) # mysql-master操作 mysql> change master to master_host='192.168.108.132',master_user='myslave',master_password='123',master_log_file='master-bin.000002',master_log_pos=2210; #这里的master_log_pos写mysq_slave01的 mysql> start slave; ......

相关推荐
灰阳阳2 小时前
Dockerfile实践-构建Nginx镜像
运维·nginx·docker·dockerfile
Johnstons3 小时前
网络流量监控工具怎么选
运维·网络·网络故障排除·网络流量分析·网络性能监控
kevin_cat4 小时前
oracle 扩展表空间
数据库·oracle
花间相见4 小时前
【MySQL面试题】—— MySQL面试高频问题汇总:从原理到实战,覆盖90%考点
数据库·mysql·面试
高梦轩5 小时前
MySQL 数据库备份与恢复
数据库·oracle
一直都在5725 小时前
Redis(二)
数据库·redis·缓存
TDengine (老段)5 小时前
TDengine IDMP 工业数据建模 —— 属性
大数据·数据库·人工智能·时序数据库·tdengine·涛思数据
信创DevOps先锋5 小时前
中国DevOps工具链选型新趋势:合规、协同与生态融合的平衡之道
运维·gitee·devops
爱丽_6 小时前
Redis 分布式锁:SET NX、过期时间、续租、可重入、Redlock 与坑
数据库·redis·分布式