可以将MySQL服务器分为主库和从库两种身份。MySQL从库同步主库的数据,MySQL主库将数据同步给从库。MySQL过程如下所示
MySQL主从同步实现主要有以下三个过程:
1、主服务器(master)将变更事件(更新、删除、表结构改变等等)写入二进制日志(bin log)。
2、从服务器(slave)的IO线程从主服务器(binlog dump线程)获取二进制日志,并在本地保存一份自己的二进制日志(relay log)
3、从服务器的SQL线程读取本地中继日志(relay log),把 relay log解析成 SQL 语句,并执行
主从复制的好处:
1.数据更安全:做了数据冗余,不会因为单台服务器的宕机而丢失数据
2.性能大大提升:一主多从,不同用户从不同数据库读取,性能提升
3.扩展性更优:流量增大时,可以方便的增加从服务器,不影响系统使用
4.负载均衡:一主多从相当于分担了主机任务,做了负载均衡。
操作系统:Anolis OS 7.9
Master IP:192.168.2.241
Slave IP:192.168.2.242
systemctl stop firewalld
//必须
关闭防护墙否则查询slave状态是一直显示连接状态中;
编译安装Mysql,Master与Slave安装相同
1.安装依赖包
yum -y install gcc gcc-c++ cmake ncurses-devel autoconf perl perl-devel
2.创建mysql安装目录以及数据库数据存放目录
mkdir /usr/local/mysqlmkdir /usr/local/mysql/data
3.创建用户、用户组
groupadd mysqluseradd -r -g mysql mysql
4.开始安装
tar xf mysql-5.6.35.tar.gzcd mysql-5.6.35[root@bogon mysql-5.6.35]# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \-DINSTALL_DATADIR=/usr/local/mysql/data \-DDEFAULT_CHARSET=utf8 \-DDEFAULT_COLLATION=utf8_general_ci \-DEXTRA_CHARSETS=all \-DENABLED_LOCAL_INFILE=1
如果安装失败需要重新编译时,需要清楚旧的对象文件和缓存信息
make cleanrm -rf CMakeCache.txtrm -rf /etc/my.cnf
设置目录权限
cd /usr/local/mysqlchown -R mysql:mysql .chown -R mysql:mysql data
将mysql的启动服务添加到系统服务中
cd /usr/local/mysqlcp support-files/my-default.cnf /etc/my.cnf
创建基础表
cd /usr/local/mysql./scripts/mysql_install_db --user=mysql
配置环境变量
vi /etc/profileexport MYSQL_HOME="/usr/local/mysql"export PATH="$PATH:$MYSQL_HOME/bin"
刷新环境变量
source /etc/profile
将mysql加入到可控制启动的服务的文件夹内,并命名mysql,即service可控制的服务名,至此可用service mysql start控制启动mysql
/etc/init.d 是/etc/rc.d/init.d的链接,在/etc/init.d添加一个文件会同步在/etc/rc.d/init.d下添加一个相同文件
cd /usr/local/mysql/cp support-files/mysql.server /etc/init.d/mysql
让mysql服务加入到开机启动指令管理的服务列表中
chkconfig --add mysql
启动mysql
systemclt start mysql
配置Mysql主从复制
1.修改Master主服务器配置文件
vim /etc/my.cnf[mysqld]log-bin=mysql-bin //[必须]启用二进制日志server-id=241 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
2.修改Slave从服务器配置文件
vim /etc/my.cnf[mysqld]log-bin=mysql-bin //[不是必须]启用二进制日志server-id=242 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
3.在主服务器建立账户并授权slave;
mysql -u root -pressetmysql>GRANT REPLICATION SLAVE ON *.* to 'resset'@'%' identified by 'resset';
4.登录主服务器的mysql,查询Master的状态
mysql> show master status;+------------------+----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000001 | 320 | | | |+------------------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化
7.从服务器设置普通用户只读模式
mysql>create user 'resset'@'%' identified by 'resset'; // 创建普通用户,可以远程连接mysql> grant select on *.* to test@'%'identified by 'test'; //授权所有库,只能查询操作mysql> grant all privileges on *.* to test@'%'identified by 'resset'; //这是授予所有权限
8.配置从服务器
change master to master_host='192.168.2.241',master_user='resset',master_password='resset',master_log_file='mysql-bin.000001',master_log_pos=320;
9检查从服务器复制功能状态
mysql> show slave status\G*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.2.241 //主服务器地址Master_User: resset //授权帐户名,尽量避免使用rootMaster_Port: 3306 //数据库端口,部分版本没有此行Connect_Retry: 60Master_Log_File: mysql-bin.000001Read_Master_Log_Pos: 320 //#同步读取二进制日志的位置,大于等于Exec_Master_Log_PosRelay_Log_File:localhost-relay-bin.000002Relay_Log_Pos: 283Relay_Master_Log_File: mysql-bin.000001Slave_IO_Running: Yes //此状态必须YESSlave_SQL_Running: Yes //此状态必须YES ...... 注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。 以上操作过程,主从服务器配置完成。
MySql主从搭建完成!
10.Mysql添加用户、删除用户与授权详细说明
1.新建用户mysql> insert into mysql.user(Host,User,Password) values("localhost","test",password("1234"));这样就创建了一个名为:test 密码为:1234 的用户。注意:此处的"localhost",是指该用户只能在本地登录,不能在另外一台机器上远程登录。如果想远程登录的话,将"localhost"改为"%",表示在任何一台电脑上都可以登录。也可以指定某台机器可以远程登录。
2.为用户授权
授权格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码";2.1 登录MYSQL(有ROOT权限),这里以ROOT身份登录:@>mysql -u root -p @>密码2.2 首先为用户创建一个数据库(testDB):mysql>create database testDB;2.3 授权test用户拥有testDB数据库的所有权限(某个数据库的所有权限):mysql>grant all privileges on testDB.* to test@localhost identified by '1234';mysql>flush privileges;//刷新系统权限表格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码";2.4 如果想指定部分权限给一用户,可以这样来写:mysql>grant select,update on testDB.* to test@localhost identified by '1234';mysql>flush privileges; //刷新系统权限表2.5 授权test用户拥有所有数据库的某些权限:mysql>grant select,delete,update,create,drop on *.* to test@"%" identified by "1234";//test用户对所有数据库都有select,delete,update,create,drop 权限。//@"%" 表示对所有非本地主机授权,不包括localhost。(localhost地址设为127.0.0.1,如果设为真实的本地地址,不知道是否可以,没有验证。)//对localhost授权: 加上一句grant all privileges on testDB.* to test@localhost identified by '1234';即可。
3.删除用户
@>mysql -u root -p@>密码mysql>Delete FROM user Where User='test' and Host='localhost';mysql>flush privileges;mysql>drop database testDB; //删除用户的数据库删除账户及权限:>drop user 用户名@'%';>drop user 用户名@ localhost;
其它Mysql操作
5. 列出所有数据库mysql>show database;6. 切换数据库mysql>use '数据库名';7. 列出所有表mysql>show tables;8. 显示数据表结构mysql>describe 表名;9. 删除数据库和数据表mysql>drop database 数据库名;mysql>drop table 数据表名;
验证Mysql主从复制是否成功
在Master创建数据库@>mysql -u root -p@>密码mysql> create database ressetDB;mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || performance_schema || ressetDB || test |+--------------------+5 rows in set (0.00 sec)
到Slave服务器查询数据库验证
@>mysql -u root -p@>密码mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || performance_schema || ressetDB || test |+--------------------+