15 MySQL服务

MySQL安装

源码包安装
#安装基础依赖
$ yum -y install cmake bison ncurses-devel
$ tar -zxf ncurses-5.9.tar.gz
$ cd ncurses-5.9
$ ./configure --with-shared --without-debug --without-ada --enable-overwrite
$ make && make install
#cmake命令在mysql的5.5版本之后,取代./configure命令进行编译、安装前的环境检查;
#bison是一个自由软件,用于自动生成语法分析器程序,可用于所有常见的操作系统;
#ncurses 提供字符终端处理库,是使应用程序(如命令终端)直接控制终端屏幕显示的函数库;
#安装ncurses依赖,需要ncurses-devel和ncurses,且ncurses需要安装对应的源码包
#源码安装ncurses选项详解:
#--with-shared    生成共享库
#--without-debug  不生成 debug 库
#--without-ada    不编译为ada绑定,因为进入chroot环境不能便用ada
#--enable-overwrite 参数为定义,指定把头文件安装到/tools/include目录下

#添加mysql用户
$ useradd -s /sbin/nologin mysql

#安装MySQL软件
$ cd mysql-5.5.48
$ cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1 -DMYSQL_USER=mysql -DMYSQL_TCP_PORT=3306
$ make && make install
#选项详解:
#-DCMAKE_INSTALL_PREFIX=/usr/local/mysql	安装位置
#-DMYSQL_UNIX_ADDR=/tmp/mysql.sock			指定socket(套接字)文件位置
#-DEXTRA_CHARSETS=all						扩展字符支持
#-DDEFAULT_CHARSET=utf8    					默认字符集
#-DDEFAULT_COLLATION=utf8_general_ci    	默认字符校对
#-DWITH_MYISAM_STORAGE_ENGINE=1   			安装myisam存储引擎
#-DWITH_INNOBASE_STORAGE_ENGINE=1    		安装innodb存储引擎
#-DWITH_MEMORY_STORAGE_ENGINE=1  			安装memory存储引擎
#-DWITH_READLINE=1    						支持readline库
#-DENABLED_LOCAL_INFILE=1   				启用加载本地数据
#-DMYSQL_USER=mysql  						指定mysql运行用户
#-DMYSQL_TCP_PORT=3306						指定mysql端口

#修改MySQL目录的用户归属
$ cd /usr/local/mysql
$ chown -R mysql data
#生成配置文件
$ cp -a lamp/mysql-5.5.48/support-files/my-medium.cnf /etc/my.cnf
#初始化数据库
$ ./scripts/mysql_install_db --user=mysql

#启动、测试
$ /usr/local/mysql/bin/mysqld_safe --user=mysql &
#设定MySQL密码
$ /usr/local/mysql/bin/mysqladmin -uroot password 123
#登录MySQL
$ /usr/local/mysql/bin/mysql -uroot -p
rpm包安装
#服务器端(centOS7是mariadb、centOS6是mysql)
$ yum -y install mariadb-server mariadb
$ systemctl start mariadb
$ systemctl enable mariadb
$ ss -antp | grep :3306
#进入mysql
$ mysql

#查看数据库的版本
$ mysqladmin --version   (centOS7默认安装5.5.56)
#更改数据库root的登陆密码
$ mysqladmin -uroot password 新密码
#进入mysql
$ mysql -uroot -p  回车输入密码
MySQL常用操作

基础DQL语句

#切换数据库
mysql> use 数据库名;
#查看该数据库下所有的数据库表
mysql> show tables;


#查询表中所有列的数据
mysql> select * from 表名;
mysql> SELECT * FROM 表名;

#查询指定列的数据
mysql >select 列名1,列名2,... from 表名;

#带条件查询数据
mysql> select 指定列名 from 表名 where 列名=;

DML语句

#查看数据库表结构
mysql> desc 表名;

#举例:extmail下的domain_manager表
mysql> CREATE TABLE domain_manager (
  username varchar(255) NOT NULL default '',
  domain varchar(255) NOT NULL default '',
  createdate datetime NOT NULL default '0000-00-00 00:00:00',
  active tinyint(1) NOT NULL default '1',
  KEY username (username)
  ) ;

#表数据修改
mysql> desc domain_manager;
mysql> select * from domain_manager;
#给所有字段插入数据
语法:insert into 表名 values(值1,值2...);
mysql> insert into domain_manager values('jimmy','hongfu.com','2021-7-7',1);
#给必须字段插入数据
语法:insert into 表名(字段1,字段2) values(值1,值2);
mysql> insert into domain_manager(username,domain,active) values('john','dongtai.com',1);

#修改所有记录
mysql> update domain_manager set active=0;
#修改指定记录
语法:update 表名 set 字段名=值 where 指定字段=指定值;
mysql> update domain_manager set active=1 where username='jimmy';


#删除所有记录
语法:delete from 表名;
mysql> delete from domain_manager;
#删除指定记录
语法:delete from 表名 where 指定字段=指定值;
mysql> delete from domain_manager where username='jimmy';

DDL语句

数据库操作
#查看数据库
mysql> show databases;
#创建数据库
mysql> create database 数据库名;
#切换数据库
mysql> use 数据库名;
#删除数据库
mysql> drop database 数据库名;
数据库表操作
mysql> use 数据库名

#查看数据库表
mysql> show tables;
#创建数据库表语法
mysql> create   table  表名(
	字段1   数据类型  非空约束   默认值约束, 
	字段2   数据类型  非空约束   默认值约束, 
	 …
    字段n   数据类型  非空约束   默认值约束
   ); 

#创建数据库t1,包含姓名、性别、学号、出生日期
mysql> create table t1 ( 
	xingming varchar(20), 
	xingbie int(1), 
	xuehao int, 
	birth datetime 
	);
#查看表结构
mysql> desc t2;
#插入数据
mysql> insert into t1 values('jimmy', 0, 2102001, '2020-9-3');
mysql> insert into t1 values('jimmy', 0, 2102001, null);
mysql> insert into t1 values('jimmy', 0, null, null);
mysql> insert into t1(xingming) values('jimmy');
mysql> insert into t1 values('jimmy', null, null, null)
mysql> insert into t1 values('null', null, null, null);
mysql> select * from t1;
#删除数据表
mysql> drop table t1;

#表内数据的域完整性:数据类型 非空约束(not null)、默认值约束(default)
#非空约束不设、默认是yes即可空;默认值约束不设、默认是null即空值。
mysql> create table t2 (  
	xingming varchar(20) not null,  
	xingbie int(1) not null,  
	xuehao int not null,  
	birth datetime  
	);
mysql> desc t2;
mysql> insert into t2 values('jimmy', 0, 2102001, '2020-9-3');
mysql> insert into t2 values('jimmy', 0, 2102001, null);
mysql> insert into t2(xingming,xingbie,xuehao) values('jimmy', 0,2102001);

#表内数据的实体(记录、行)完整性:主键约束(primary key)、唯一约束(uniqe key)、自动增长列(auto_increment)
#给某列设置自增时,该列必须是主键
mysql> create table t3 (  
	xingming varchar(20) not null,  
	xingbie int(1) not null default 0,  
	xuehao int not null,  
	birth datetime  
	);
mysql> desc t3;
mysql> insert into t3 values('jimmy', 0, 2102001, '2020-9-3');
mysql> insert into t3 values('jimmy', 0, 2102001, null);
mysql> insert into t3(xingming,xuehao) values('jimmy', 2102001);
--------------------------------------------

#表结构修改
mysql> create table t11(
 id int,
 name varchar(20),
 sex int)ENGINE=InnoDB DEFAULT CHARSET=utf8;
或指定数据库:create database hongfu default charset=utf8;
#修改表名:把表名t1修改为xinxi
语法:alter table 旧表名 rename 新表名;
mysql> alter table t11 rename xinxi;
#增加列:给xinxi表添加出生日期birth列
语法:alter table 表名 add 列名 数据类型 [约束 默认值];
mysql> alter table xinxi add birth datetime; (添加到最后位置)
mysql> alter table xinxi add date year first; (添加到第一个字段)
mysql> alter table xinxi add date year after age; (添加到指定字段后面)
#删除列:删除xinix表中的birth列
语法:alter table 表名 drop 列名;
mysql> alter table xinxi drop birth;
#修改列名:把xinxi表里的id改成xuehao
语法:alter table 表名 change 旧列名 新列名 数据类型 [约束 默认值];
mysql> alter table xinxi change id xuehao int not null;
#修改列的类型:把xinxi表里的sex列限制1位长度、name列设为为空
语法:alter table 表名 modify 列名 数据类型 [约束 默认值];
mysql> alter table xinxi modify sex int(1);
mysql> alter table xinxi modify name varchar(20) not null;
----------------------------------------

#表内数据的实体(记录、行)完整性:主键约束(primary key)、唯一约束(uniqe key)、自动增长列(auto_increment)
#给某列设置自增时,该列必须是主键
#查看约束信息
mysql> show keys|index from xinxi;
#添加约束:添加xuehao主键、name唯一键
语法:alter table 表名 add unique|primary key(字段名);
mysql> alter table xinxi add unique key(name);
mysql> alter table xinxi add primary key(xuehao);
#删除主键约束:
语法:alter table 表名 drop primary key(字段名);
mysql> alter table xinxi drop primary key;
#删除唯一键约束,需要用约束名来删除
语法:drop index 约束名 on 表名;
mysql> drop index name on xinxi;


#创建数据表时指定实体约束
#建表时指定主键
mysql> create table t5 ( 
	id int primary key, 
	name varchar(20), 
	birth datetime, 
	work year
	);
mysql> create table t4 ( 
	id int, 
	name varchar(20), 
	birth datetime, 
	work year , 
	primary key(id)
	);
#建表时指定唯一键
mysql> create table t6 ( 
	id int primary key, 
	name varchar(20) unique key, 
	birth datetime, 
	work year);
mysql> create table t7 ( 
	id int primary key, 
	name varchar(20), 
	birth datetime, 
	work year, 
	constraint name_uni_key unique(name)
	);

约束:
1.约束是用于限制加入表的数据;可以在创建表的时候规则约束、也可以在建完表后进行调整。
2.常见约束:
  域约束:非空(not null)、默认值(default)
  实体约束:唯一、重复(主键、唯一键)
  表间约束:外键
  
----------------------------------
#索引:类似书的目录,提高数据查询的速度;存取结构受存储引擎影响
mysql> create index 索引名 on xinxi(xuehao);
mysql> show index|indexes|keys from xinxi;
mysql> drop index 索引名 on xinxi;

----------------------------------
#多表级联
#准备数据表xinxi、paihangbang,及若干数据
mysql> create table xinxi(
 id int not null auto_increment,
 name varchar(20) not null,
 sex int(1) not null default 0,
 birth datetime,
 primary key(id),
 unique key(name)
 );
mysql> insert into xinxi(name,sex,birth) values('xiaozhan',0,'1990-1-1');
mysql> insert into xinxi(name,sex,birth) values('luhan',0,'1990-4-20');
mysql> insert into xinxi(name,sex,birth) values('liying',1,'1988-1-1');
mysql> insert into xinxi(name,sex,birth) values('baby',1,'1989-1-1');

mysql> create table paihangbang(
 id int not null, 
 score int, 
 rank int, 
 name varchar(20) 
 );
mysql> insert into paihangbang values(1,100,1,'xiaozhan');
mysql> insert into paihangbang values(2,98,2,'luhan');
mysql> insert into paihangbang values(3,97,3,'tangyan');
mysql> insert into paihangbang values(4,96,4,'liying');

#用共有的字段连接两张表,inner join两边都有记录、left join以主表记录为准、right join以副表记录为准
语法:select * from 主表名 inner|left|right join 副表名 on 主表.字段=副表.字段;
mysql> select * from xinxi inner join paihangbang on xinxi.name=paihangbang.name;
mysql> select * from xinxi left join paihangbang on xinxi.name=paihangbang.name;
mysql> select * from xinxi right join paihangbang on xinxi.name=paihangbang.name;

#外键约束,参照完整性,用来在两个表的数据之间建立连接;
#一张表可以设置多个外键,一个外键可以加载单列或多列上;
#外键是表中的一个字段、不是本表的主键,但需要对应另一个表的主键;
#外键定义后,不允许删除另一个表中有关联的行;
语法:ALTER TABLE <数据表名> ADD CONSTRAINT <索引名>
FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);
语法:ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;

mysql> create table paihangbang1(
  name varchar(20) primary key, 
  score int, 
  rank int
 );
#在从表paihangbang1上建立外键,会对应将主表该字段设置为唯一键
mysql> alter table paihangbang1 add constraint fk_name foreign key(name) references xinxi(name);
#插入数据
mysql> insert into paihangbang1 values('xiaozhan',100,1);
mysql> insert into paihangbang1 values('luhan',98,2);
#插入报错,外键关键的主表字段中没有
mysql> insert into paihangbang1 values('tangyan',97,3);
mysql> insert into paihangbang1 values('liying',96,4);

#想删除主表的字段,需要把该字段上关联的外键先删除

高级DQL

#select的高级条件查询
mysql> create table xinxi(
       id int auto_increment primary key,
       xuehao varchar(6) not null unique key,
       name varchar(50) not null,
       sex int(1) not null default 0,
       address text
       );
mysql> insert into xinxi(xuehao,name,address) values('201201','zhao','beijing');
mysql> insert into xinxi(xuehao,name,address) values('201202','qian','shanghai');
mysql> insert into xinxi(xuehao,name,address) values('201203','sun','guangzhou');
mysql> insert into xinxi(xuehao,name,address) values('201204','li','shenzhen');
mysql> select * from xinxi;

#条件查询
mysql> select * from xinxi where xuhao='201203';
#查询指定列
mysql> select name, xuehao from xinxi;
#查询结果指定别名
mysql> select name as 姓名, xuehao as 学号 from xinxi;

#查询数据的记录数
mysql> select count(*) from xinxi;
#获取结果的前几条
mysql> select name as 姓名, xuehao as 学号 from xinxi limit 4;
#结果中的取值范围[2,4)
mysql> select name as 姓名, xuehao as 学号 from xinxi limit 2,4;

#where结合in、not in,同时查询指定的多条数据
mysql> select * from xinxi where id in(2,4);
mysql> select * from xinxi where id not in(2,4);
mysql> select * from xinxi where xuehao in('201201','201204');
mysql> select * from xinxi where xuehao not in('201201','201204');
#where结合between,查询指定范围的数据[2,4]
mysql> select * from xinxi where id between 2 and 4;
mysql> select * from xinxi where id not between 2 and 4;
mysql> select * from xinxi where name between 'qian' and 'zhao';
mysql> select * from xinxi where name between 'q' and 'z';

#where查询某些字段不是null的情况
mysql> select * from xinxi where name is not null;
mysql> select * from xinxi where name is null;

#where结合like,使用通配符进行匹配查询;默认完全匹配
#常用通配符:_是代表一个字符、%是代表一个或多个字符
mysql> select * from xinxi where name like 's';
mysql> select * from xinxi where name like 's_';
mysql> select * from xinxi where name like 's__';
mysql> select * from xinxi where name like 's%';
#查询数据库的参数变量
mysql> show variables like 'auto_increment%';
#修改自增属性
mysql> show variables like 'auto_increment%';
mysql> set @@auto_increment_increment=2;
mysql> set @@auto_increment_offset=2;
#修改字符集
mysql> show variables like '%char%';


#查询后的结果排序、默认升序排列(asc、desc)
#若排序列是数值类型,则按数字大小排序;若排序列是字符串类型,则按ASCII顺序
mysql> select * from xinxi order by name;
mysql> select * from xinxi order by name asc;
mysql> select * from xinxi order by name desc;
mysql> select * from xinxi order by id desc;
mysql> select * from xinxi order by address asc, id desc;

------------------------
#索引:类似书的目录,提高数据查询的速度;存取结构受存储引擎影响
mysql> alter table xinxi add unique key(xuehao);
或:mysql> create index 索引名 on xinxi(xuehao);
mysql> show index|indexes|keys from xinxi;
mysql> drop index 索引名 on xinxi;

----------------------------
#视图:将查询结果集封装成一张可视化表中,可改变SQL语句、不影响数据库结构
语法:create view 视图名 as 查询语句;
mysql> create view get_by_id_view as select * from xinxi order by id desc;
mysql> select * from get_by_id_view;
mysql> drop view get_by_id_view;
#查看视图
mysql> use 数据库名 
mysql> show table status where comment='view';

-------------------------------
#存储过程(stored procedure):是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象;
#存储过程是为了完成特定功能的SQL语句集,经编译创建并保存咋数据库中,用户可通过指定存储过程的名字并给定需要的参数进行调用执行;

#--是注释
#将语句的结束符号从分号;临时改为两个$$(可以是自定义)
mysql> delimiter $$
mysql> create procedure delete_data()
      begin
      	delete from xinxi;
      	delete from t11;
      end $$
mysql> call delete_data;
mysql> delimiter ;
#查看存储过程
mysql> show procedure status;
#删除存储过程
mysql> drop procedure delete_data;

#传参的存储过程

DCL语句

#数据库连接
语法:mysql -u 用户名  -p密码 -P 端口  -h 主机 -S 套接字
#本机连接
$ mysql
$ mysqladmin -u用户名 password 密码值
$ mysql -u用户名 -p密码
#可以登录的用户存储在数据库mysql中的user表中
mysql> use mysql
mysql> select  user,host  from  user; 

#创建远程连接用户
mysql> create user '用户名'@'%' identified by '用户密码';
#新用户登录、默认只拥有test数据库权限
$ mysql -h 服务器IP  -P端口 -u用户名 -p密码
#删除用户
mysql> drop user '用户名'@'登录地址';

-----------------------------
#数据库授权
$ mysql -uroot -p密码
#给存在的用户授权
mysql> grant all (privileges) on 数据库名.数据库表 to '用户名'@'登录地址';
#查看用户的授权情况
mysql> show grants for '用户名'@'登录地址';
#创建新用户的同时直接授权
mysql> grant all on 数据库名.数据库表 to '用户名'@'登录地址' identified by '用户密码';
#取消授权
mysql> revoke all on 数据库名.数据库表 from '用户名'@'登录地址';

all privileges:所有权限。
select:读取权限。
create:创建权限。
delete:删除权限。
update:更新权限。
drop:删除数据库、数据表权限。

1) 授予数据库权限时,<权限类型>可以指定为以下值:
SELECT:表示授予用户可以使用 SELECT 语句访问特定数据库中所有表和视图的权限。
INSERT:表示授予用户可以使用 INSERT 语句向特定数据库中所有表添加数据行的权限。
DELETE:表示授予用户可以使用 DELETE 语句删除特定数据库中所有表的数据行的权限。
UPDATE:表示授予用户可以使用 UPDATE 语句更新特定数据库中所有数据表的值的权限。
REFERENCES:表示授予用户可以创建指向特定的数据库中的表外键的权限。
CREATE:表示授权用户可以使用 CREATE TABLE 语句在特定数据库中创建新表的权限。
ALTER:表示授予用户可以使用 ALTER TABLE 语句修改特定数据库中所有数据表的权限。
SHOW VIEW:表示授予用户可以查看特定数据库中已有视图的视图定义的权限。
CREATE ROUTINE:表示授予用户可以为特定的数据库创建存储过程和存储函数的权限。
ALTER ROUTINE:表示授予用户可以更新和删除数据库中已有的存储过程和存储函数的权限。
INDEX:表示授予用户可以在特定数据库中的所有数据表上定义和删除索引的权限。
DROP:表示授予用户可以删除特定数据库中所有表和视图的权限。
CREATE TEMPORARY TABLES:表示授予用户可以在特定数据库中创建临时表的权限。
CREATE VIEW:表示授予用户可以在特定数据库中创建新的视图的权限。
EXECUTE ROUTINE:表示授予用户可以调用特定数据库的存储过程和存储函数的权限。
LOCK TABLES:表示授予用户可以锁定特定数据库的已有数据表的权限。
ALL 或 ALL PRIVILEGES:表示以上所有权限。
2) 授予表权限时,<权限类型>可以指定为以下值:
SELECT:授予用户可以使用 SELECT 语句进行访问特定表的权限。
INSERT:授予用户可以使用 INSERT 语句向一个特定表中添加数据行的权限。
DELETE:授予用户可以使用 DELETE 语句从一个特定表中删除数据行的权限。
DROP:授予用户可以删除数据表的权限。
UPDATE:授予用户可以使用 UPDATE 语句更新特定数据表的权限。
ALTER:授予用户可以使用 ALTER TABLE 语句修改数据表的权限。
REFERENCES:授予用户可以创建一个外键来参照特定数据表的权限。
CREATE:授予用户可以使用特定的名字创建一个数据表的权限。
INDEX:授予用户可以在表上定义索引的权限。
ALL 或 ALL PRIVILEGES:所有的权限名。
3) 授予列权限时,<权限类型>的值只能指定为 SELECT、INSERT 和 UPDATE,同时权限的后面需要加上列名列表 column-list。
4) 最有效率的权限是用户权限。
授予用户权限时,<权限类型>除了可以指定为授予数据库权限时的所有值之外,还可以是下面这些值:
CREATE USER:表示授予用户可以创建和删除新用户的权限。
SHOW DATABASES:表示授予用户可以使用 SHOW DATABASES 语句查看所有已有的数据库的定义的权限。
MySQL运维操作
#忘记数据库密码
#设置初始密码
$ mysqladmin -u用户名 password 密码
#更改密码
$ mysqladmin -u用户名 -p, 回车输入密码
mysql> set password = password('密码');
#忘记密码
$ pkill -9 mysql
$ vim /etc/my.cnf
	[mysqld]            #mysql服务配置区域
	skip-grant-table    #添加跳过权限表验证
$ /usr/local/mysql/bin/mysqld_safe --user=mysql &  #源码包启动
或 mysqld_safe --user=mysql &                      #rpm包启动
$ mysql    #直接无密码进入mysql即可
mysql> update user set password=password('123') where User='root' and Host='localhost';                   #数据库重设密码
$ 退出数据库,把配置文件添加的行去掉,重启数据库即可
---------------------------------

#数据库备份
#复制数据文件
$ cp -a /usr/local/mysql/data  备份目录
$ cp -a /var/lib/mysql  备份目录

#mysqldump命令
#备份,文件格式:mysql-备份人-时间.sql
$ mysqldump -u用户名 -p密码 要备份的数据库名 > 文件名.sql
#还原,自己创建数据库
$ mysql -u用户名 -p密码 要还原到的数据库名 < 文件名.sql

#二进制日志文件恢复
mysql> mysqlbinlog mysql-bin.000001
mysql> mysqlbinlog --start-position 106 --stop-position 185 mysql-bin.000001 | mysql -uroot -p

MySQL集群搭建
MySQL主从(从)搭建
主服务器
#安装mysql、启动服务
$ yum -y install mariadb mariadb-server
$ mysqladmin -uroot password 123
#配置主配置文件:打开二进制日志、设置id值
$ vim /etc/my.cnf
	log-bin=mysql-bin
	server-id=1
$ systemctl restart mariadb

#创建用于同步的用户、并授权
$ mysql -uroot -p123
mysql> grant all on *.* to 'rsyncer'@'%' identified by '123';
#查看当前服务器的日志文件及偏移量
mysql> show master status;

从服务器
#安装mysql、启动服务
$ yum -y install mariadb mariadb-server
$ mysqladmin -uroot password 123
#配置主配置文件:打开二进制日志、设置id值
$ vim /etc/my.cnf
	log-bin=mysql-bin
	server-id=2
$ systemctl restart mariadb

#设置同步
$ mysql -uroot -p123
mysql> change master to master_host='主服务器IP',master_user='用户',master_password='用户密码',master_log_file='二进制文件',master_log_pos=偏移量;
mysql> start slave;

#查看同步状态
mysql> show slave status\G;
#关闭同步
mysql> stop slave;

结果注:
1.若IO线程是no,则change master to出了问题;
2.若sql线程是no,则同步的数据出了问题;
测试
打开salve同步时,在主服务器内创建数据库、插入数据,在从服务器上可以查询到;
关闭slave后,在主服务器上的操作,在从服务器查询不到,两个服务器数据不一致;

————————————————————————

MySQL主主从搭建

一个mysql实例只能开启作为一个slave,去同步一个从服务器的数据。如果运行多次不同的change master to,开启slave,以最后一次的主服务器进行同步。

主1服务器
#安装mysql、启动服务
$ yum -y install mariadb mariadb-server
$ mysqladmin -uroot password 123
#配置主配置文件:打开二进制日志、设置id值
$ vim /etc/my.cnf
	log-bin=mysql-bin
	server-id=10
$ systemctl restart mariadb

#创建用于同步的用户、并授权
$ mysql -uroot -p123
mysql> grant all on *.* to 'rsyncer'@'%' identified by '123';
#查看当前服务器的日志文件及偏移量
mysql> show master status;

主2服务器
#安装mysql、启动服务
$ yum -y install mariadb mariadb-server
$ mysqladmin -uroot password 123
#配置主配置文件:打开二进制日志、设置id值
$ vim /etc/my.cnf
	log-bin=mysql-bin
	server-id=11
$ systemctl restart mariadb

#创建用于同步的用户、并授权
$ mysql -uroot -p123
mysql> grant all on *.* to 'rsyncer'@'%' identified by '123';
#查看当前服务器的日志文件及偏移量
mysql> show master status;

从服务器
$ yum -y install mysql mysql-server
#配置多个mysql实例
$ vim /etc/my.cnf
	#添加
	[mysqld_multi]
	mysqld=/usr/bin/mysqld_safe
	mysqladmin=/usr/bin/mysqladmin
	log=/tmp/multi.log
	
	[mysqld12]
	port=3306
	pid-file=/var/lib/mysql12/mysqld.pid
	datadir=/var/lib/mysql12
	socket=/var/lib/mysql12/mysql.sock
	server-id=12
	user=mysql
	
	[mysqld13]
	port=3307
	pid-file=/var/lib/mysql13/mysqld.pid
	datadir=/var/lib/mysql13
	socket=/var/lib/mysql13/mysql.sock
	server-id=13
	user=mysql
#根据上述配置、创建对应的目录
$ mkdir /var/lib/mysql12
$ mkdir /var/lib/mysql13
$ chown -R mysql /var/lib/mysql12
$ chown -R mysql /var/lib/mysql13
#初始化数据库实例
$ mysql_install_db --datadir=/var/lib/mysql12 --user=mysql
$ ls /var/lib/mysql12   #查看生成的默认数据库文件夹

$ mysql_install_db --datadir=/var/lib/mysql13 --user=mysql
$ ls /var/lib/mysql13   #查看生成的默认数据库文件夹
#启动服务、更改密码
$ mysqld_multi --defaults-file=/etc/my.cnf start 12
$ mysqladmin -S /var/lib/mysql12/mysql.sock -uroot password 123
$ mysql -S /var/lib/mysql12/mysql.sock -uroot -p123

$ mysqld_multi --defaults-file=/etc/my.cnf start 13
$ mysqladmin -S /var/lib/mysql13/mysql.sock -uroot password 123
$ mysql -S /var/lib/mysql13/mysql.sock -uroot -p123

----
#配置主从同步关系(主1和从12、主2和从13)
$ mysql -S /var/lib/mysql12/mysql.sock -uroot -p123
mysql> change master to master_host='主1服务器IP',master_user='用户',master_password='用户密码',master_log_file='二进制文件',master_log_pos=偏移量;
mysql> start slave;
mysql> show slave status\G;

$ mysql -S /var/lib/mysql13/mysql.sock -uroot -p123
mysql> change master to master_host='主2服务器IP',master_user='用户',master_password='用户密码',master_log_file='二进制文件',master_log_pos=偏移量;
mysql> start slave;
mysql> show slave status\G;

测试
在一台主服务器上操作,在从服务器上对应的实例中可以看到变化;

———————————————————————————

MySQL主主搭建
主1服务器
#安装mysql、启动服务
$ yum -y install mariadb mariadb-server
$ mysqladmin -uroot password 123
#配置主配置文件:打开二进制日志、设置id值
$ vim /etc/my.cnf
	log-bin=mysql-bin
	server-id=11
	
	#设置同步参数
	#设置要同步的数据库
	replicate-do-db=test  
	#忽略、不同步的数据库 
	replicate-ignore-db=mysql 
	replicate-ignore-db=information_schema 
	 #主键的每次增长值、初始值
	auto-increment-increment=2
	auto-increment-offset=1 
$ systemctl restart mariadb

#创建用于同步的用户、并授权
$ mysql -uroot -p123
mysql> grant all on *.* to 'rsyncer1'@'%' identified by '123';
#查看当前服务器的日志文件及偏移量
mysql> show master status;

#作为主2服务器的从服务器
mysql> change master to master_host='主2服务器IP',master_user='rsyncer2',master_password='123',master_log_file='二进制文件',master_log_pos=偏移量;
mysql> start slave;
mysql> show slave status\G;

主2服务器
#安装mysql、启动服务
$ yum -y install mariadb mariadb-server
$ mysqladmin -uroot password 123
#配置主配置文件:打开二进制日志、设置id值
$ vim /etc/my.cnf
	log-bin=mysql-bin
	server-id=11
	
	#设置同步参数
	#设置要同步的数据库
	replicate-do-db=test  
	#忽略、不同步的数据库 
	replicate-ignore-db=mysql 
	replicate-ignore-db=information_schema 
	 #主键的每次增长值、初始值
	auto-increment-increment=2
	auto-increment-offset=2
$ systemctl restart mariadb

#创建用于同步的用户、并授权
$ mysql -uroot -p123
mysql> grant all on *.* to 'rsyncer2'@'%' identified by '123';
#查看当前服务器的日志文件及偏移量
mysql> show master status;

#作为主1服务器的从服务器
mysql> change master to master_host='主1服务器IP',master_user='rsyncer1',master_password='123',master_log_file='二进制文件',master_log_pos=偏移量;
mysql> start slave;
mysql> show slave status\G;

测试
在两个服务器的任何一边进行操作,都会同步到对方;

————————————————————————

MySQL读写分离
python调用mysql
#安装python
$ yum install -y openssl-devel openssl-static zlib-devel lzma tk-devel xz-devel bzip2-devel ncurses-devel gdbm-devel readline-devel sqlite-devel gcc libffi-devel
$ tar -zxf Python-3.7.6.tgz
$ cd Python-3.7.6
$ ./configure --enable-optimizations
$ make && make install  #最后显示pip安装成功

#测试
$ python3 -- exit()
$ pip3 -V(大)
#确定python3安装位置,为后面写脚本第一行做准备
$ which python3  #显示:/usr/local/bin/python3
#以后写python文件时,以.py命令、文件第一行写:/usr/local/bin/python3
$ ln -s /usr/local/bin/python3  /usr/bin/python3

#python连接mysql
1.pycharm中import pymysql
2.Linux中联网:pip3 install PyMySQL

$ vim test-mysql.py
    #!/usr/bin/python3
    import pymysql
    # 打开数据库连接
    db = pymysql.connect(host="192.168.xx.xx", user="root", password="xxxx", database="xxx")
    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = db.cursor()
    
    #获取一条记录
    # 使用 execute()  方法执行 SQL 查询 
    cursor.execute("SELECT * from 表名 limit 1;")
    # 使用 fetchone() 方法获取单条数据
    data = cursor.fetchone()
    #根据数据库表的字段类型进行赋值、打印
    print("id: %d" %data[0])
	print("name: %s" %data[1])
	
	#获取多条记录
    # 使用 execute()  方法执行 SQL 查询 
    cursor.execute("SELECT * from 表名;")
    #获取结果集的行数
    count = cursor.rowcount
    print("total num: %d" %count)
    # 使用 fetchone() 方法获取单条数据
    data = cursor.fetchall()
    #根据数据库表的字段类型进行赋值、打印
    for i in data:
    	print("id: %d" %i[0])
		print("name: %s" %i[1])
	
    # 关闭数据库连接
    db.close()
    
#Python查询Mysql使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据。
fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
fetchall(): 接收全部的返回结果行.
rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值