一、数据库概述

​ 数据:描述事物的符号记录,可以是数字,也可以是文字、图形、图像、声音、语言等,数据有多种形式,它们都可以经过数字化后存入计算机。

​ 数据库:存储数据的仓库,是长期存放在计算机内、有组织、可共享的大量数据的集合。数据库中的数据按照一定数据模型组织、描述和存储,具有较小的冗余度,较高的独立性和易扩展性,并为各种用户共享,即数据库有永久存储、有知识和可共享三个基本特点。

数据库服务器的基本概念
DBMS 数据库管理系统(能够操作和管理数据库的大型软件)

1.层次模型(Hie`rchical)

层次模型是数据库系统最早使用的一种模型,它的数据结构是一棵“有向树”。根结点在最上端,层次最高,子结点在下,逐层排字段。层次模型的特征是:
有且仅有一个结点没有父结点,它就是根结点;
其他结点有且仅有一个父结点。图所示为一个系教务管理层次数据模型,图(a)所示的是实体之间的联系,图(b)所示的是实体型之间的联系。
最有影响的层次模型的DBS是20世纪60年代末,IBM公司推出的IMS层次模型数据库系统。

2.网状模型(Network)

​ 网状模型以网状结构表示实体与实体之间的联系。网中的每一个结点代表一个记录类型,联系用链接指针来实现。网状模型可以表示多个从属关系的联系,也可以表示数据间的交叉关系,即数据间的横向关系与纵向关系,它是层次模型的扩展。网状模型可以方便地表示各种类型的联系,但结构复杂,实现的算法难以规范化。
其特征是:
​ 允许结点有多于一个父结点;
​ 可以有一个以上的结点没有父结点。

下图所示为一个系教务管理网状数据模型。

3.关系模型(Relation)

​ 关系模型以二维表结构来表示实体与实体之间的联系,它是以关系数学理论为基础的。关系模型的数据结构是一个“二维表框架”组成的集合。每个二维表又可称为关系。在关系模型中,操作的对象和结果都是二维表。关系模型是目前最流行的数据库模型。支持关系模型的数据库管理系统称为关系数据库管理系统,Access就是一种关系数据库管理系统。图所示为一个简单的关系模型,其中图(a)所示为关系模式,图(b)所示为这两个关系模型的关系,关系名称分别为教师关系和课程关系,每个关系均含3个元组,其主码均为“教师编号”。

描述的一致性,不仅用关系描述实体本身,而且也用关系描述实体之间的联系;

可直接表示多对多的联系;

关系必须是规范化的关系,即每个属性是不可分的数据项,不许表中有表;

关系模型是建立在数学概念基础上的,有较强的理论依据。

在关系模型中基本数据结构就是二维表,不用像层次或网状那样的链接指针。记录之间的联系是通过不同关系中同名属性来体现的。例如,要查找“刘晋”老师所上的课程,可以先在教师关系中根据姓名找到教师编号“1984030”,然后在课程关系中找到“1984030”任课教师编号对应的课程名即可。通过上述查询过程,同名属性教师编号起到了连接两个关系的纽带作用。由此可见,关系模型中的各个关系模式不应当是孤立的,也不是随意拼凑的一堆二维表,它必须满足相应的要求。

RDBMS 关系式数据库

​ 1.数据以表格的形式出现
​ 2.每行为各种记录名称
​ 3.每字段为记录名称所对应的数据域
​ 4.许多的行和字段组成一张表单(table)
​ 5.若干的表单组成库(database)

数据表

​ 记录(数据)
​ 字段(id name …)
​ 字段类型

​ 数据类型用于指定特定字段所包含数据的规则,它决定了数据保存在字段里的方式,包括分配给字段的宽度,以及值是否可以是字母、数字、日期和时间等。任何数据或数据的组合都有对应的数据类型,用于存储字母、数字、日期和时间、图像、二进制数据等。数据类型是数据本身的特征,其特性被设置到表里的字段。

SQL语言最基本的数据类型是:
字符串类型(char(0-255),varchar(0-65535))
数值类型(int、float)
日期和时间类型(date)
NULL数据类型(任意类型)

约束
域约束:数据类型约束
外键约束:引用完整性约束
主键约束:某字段能惟一标识此字段所属的实体,并且不允许为空,一张表中只能有一个主键
惟一性约束:每一字段都不允许出现相同值,可以为空,一张表中可以有多个

索引
索引是一个单独的、物理的数据库结构,它是某个表中一字段或若干字段值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。表的存储由两部分组成,一部分用来存放数据页面,另一部分存放索引页面。通常,索引页面相对于数据页面来说小得多。数据检索花费的大部分开销是磁盘读写,没有索引就需要从磁盘上读表的每一个数据页,如果有索引,则只需查找索引页面就可以了。所以建立合理的索引,就能加速数据的检索过程。


数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。

数据库逻辑关系:
表示层:表(数据)
逻辑层:存储引擎(提供存储、创建、更新、查询数据的实现方法)
物理层:文件

数据库存储和查询:
存储管理器(实现存储的功能,通过DDL创建数据表的结构,再通过DML来保存数据)
事务管理器:提供事务功能
文件管理器:保存数据库数据和文件的对应关系
权限及完整性管理器:设置存储权限
缓冲管理器:管理缓冲空间
查询管理器:(实现查询的功能,接收用户的查询请求、理解用户查询请求,将查询请求提交给存储管理器、实现最终存储)

DML 解析器:用来操作数据库中的数据
INSERT
DELETE
SELECT
UPDATE

DDL 解析器:用来建立数据库、定义数据关系
CREATE
DROP
ALTER

DCL 解析器:用来控制数据库组建的权限
GRANT
REVOKE

程序跟数据库的连接方式:
JDBC:(动态SQL):程序设计语言使用函数(mysql_connect())与RDBMS服务器建立连接,并进行交互;通过建立连接向SQL服务器发送查询语句,并将结果保存至变量中而后进行处理
ODBC:(嵌入式SQL)与动态SQL类似,但其语言必须程序编译时完全确定下来

mysql 支持的存储引擎
MYISAM
默认引擎、插入和查询速度较快
不支持事务、行级锁和外键约束等功能
注:事务:一段sql语句的批处理、为了保证数据原子性

锁:行级锁(冲突少、速度慢);表级锁(冲突多、速度快);页级锁(折中方案)
INNODB
支持事务、行级锁和外键约束等功能

​ MEMORY
​ 工作在内存中,通过散列字段保存数据,速度快、不能永久保存数据

事务(Transaction)是并发控制的基本单位。
所谓的事务,它是一个操作序字段,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转账工作:从一个账号扣款并使另一个账号增款,这两个操作要么都执行,要么都不执行。所以,应该把它们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。
针对上面的描述可以看出,事务的提出主要是为了解决并发情况下保持数据一致性的问题。

事务具有以下4个基本特征。
1.Atomic(原子性):事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。
2.Consistency(一致性):只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态。
3.Isolation(隔离性):事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。
4.Durability(持久性):事务结束后,事务处理的结果必须能够得到固化

数据库工作模式
单进程多线程的工作模式
守护线程
应用线程(用户线程)

mysql优化
1.垂直扩展
2.线程重用
3.缓存机制(redis、mongodb)

E-R模型
实体关系模型
实体:数据对象,即看得见摸得着
联系:表示一个或多个实体之间的关联

数据库的版本
社区版
企业版
集群版

二、命令

数据库的安装

1.专用软件包管理器(二进制)
deb 、rpm等
mysql MySQL客户端程序和共享库
mysql-server MySQL服务器需要的相关程序

2.源代码软件包(编译安装)
configure、cmake
数据库常用的配置选项
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql ----指定安装路径(默认的就是/usr/local/mysql)
-DMYSQL_DATADIR=/data/mysql ----mysql的数据文件路径
-DSYSCONFDIR=/etc ----配置文件路径
-DWITH_INNOBASE_STORAGE_ENGINE=1 ----使用INNOBASE存储引擎
-DWITH_READLINE=1 ----支持批量导入mysql数据
-DWITH_SSL=system ----mysql支持ssl
-DWITH_ZLIB=system ----支持压缩存储
-DMYSQL_TCP_PORT=3306 ----默认端口3306
-DENABLED_LOCAL_INFILE=1 ----启用加载本地数据
-DMYSQL_USER=mysql ----指定mysql运行用户
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock ----默认套接字文件路径
-DEXTRA_CHARSETS=all ----是否支持额外的字符集
-DDEFAULT_CHARSET=utf8 ----默认编码机制
-DWITH_DEBUG=0 ----DEBUG功能设置

3.服务:mysqld
4.端口:3306
5.主配置文件:/etc/myf
6.初始化脚本:mysql_install_db
7.启动命令:mysqld_safe
8.数据目录 : rpm: /var/lib/mysql
源码: PREFIX/data
9.套接字文件:rpm: /var/lib/mysql/mysql.sock
源码: PREFIX/data/mysql.sock
自定义路径:/tmp
#当意外关闭数据库时,再开启时假如开启不了,找到这个,删除再启动
#mysql.sock文件的路径要保证 mysql 的进程有权限进行创建文件
mysql的进程需要对目录具有 w 权限,才能在目录内创建 mysql.sock 文件
10.进程文件:/var/run/mysqld/mysqld.pid

登录及退出mysql环境

a)   设置密码 mysqladmin  -uroot  password '123'
b)   登录    mysql -u 用户名 -p
						-p 用户密码 
						-h 登陆位置(主机名或ip地址)
						-P 端口号(3306改了就不是了)
						-S 套接字文件(/var/lib/mysql/mysql.sock)
c)   退出    exit && ctrl+d

Mysql sql语句

Mysql命令功能
show databases;查看服务器中当前有哪些数据库
use 数据库名;选择所使用的数据库
create database 数据库名;创建数据库
drop database 数据库名;删除指定的数据库
MySQL命令功能
create table 表名 (字段1 类型1,…);在当前数据库中创建数据表
show tables;显示当前数据库中有哪些数据表
describe 表名;显示当前或指定数据库中指定数据表的结构(字段)信息
drop table 表名;删除当前或指定数据库中指定的数据表
alter table 旧表名 rename 新表名;修改数据表的名称
alter table 表名 modify 字段 新类型;修改字段的类型
alter table 表名 change 旧字段名 新字段名 类型;修改字段名
alter table 表名 add 字段 类型(first/after)增加字段
alter table 表名 drop 字段删除字段
MySQL命令功能
insert into 表名(字段1,字段2,……) values(字段1的值, 字段2的值,……);向数据表中插入新的记录
update 表名 set 字段名=新数据 where 条件表达式;修改、更新数据表中的记录
select 字段名1,字段名2……from 表名 where 条件表达式;从数据表中查找符合条件的记录
select * from 表名;显示当前数据库的表中的记录
delete from 表名 where 条件表达式; between…and…在数据表中删除指定的记录 指定范围
delete from 表名;将当前数据库表中记录清空

注:库和表的删除用drop,记录删除用delete

用户权限
grant 权限1,权限2,… on 数据库.数据表 to 用户@登录位置 (identified by ‘密码’);
revoke 取消的权限1,取消的权限2,… on 数据库.数据表 from 用户@登录位置;
show grants for 用户@登录位置;

备份和还原
mysqldump
备份: mysqldump -u 用户名 -p 数据库名 > /备份路径/备份文件名(备份整个数据库)
mysqldump -u 用户名 -p 数据库名 表名 > /备份路径/备份文件名(备份数据表)
–databases 库1,库2 (还原:mysql < 备份文件)
–all-databases —备份服务器中的所有数据库内容
还原:mysql 数据库 < 备份文件
mysqlhotcopy
备份:mysqlhotcopy --flushlog -u=’用户’ -p=’密码’ --regexp=正则 备份目录
还原:cp -a 备份目录 数据目录(/var/lib/mysql)

补充的备份机制
1.日志备份

>mysql show global variables like ‘%log%’			列出mysql中和日志相关的变量

错误日志
服务器启动和关闭时的信息
服务器运行过程中的错误信息
从服务器启动从服务器进程时产生的信息
log-error 错误日志的路径

一般日志(不启用)
记录用户对数据库的查询操作
general-log=ON 启动一般查询日志
log=ON 全局日志开关
log-output 日志的记录类型

慢查询日志
记录需要较长时间的查询操作
log-slow-queries=保存路径 启动慢查询日志,并设置个路径

二进制日志
所有对数据库状态更改的操作(create、drop、update等)
log-bin=位置 启动二进制日志
>mysql show binary logs 查看当前使用的二进制日志
>mysql show binlog events in ‘二进制日志(mysql-bin.000001)’ 查看二进制日志的内容
还原:(mysqlbinlog)
按时间还原:
mysqlbinlog --start-datetime ‘YY-MM-DD HH:MM:SS’ --stop-datetime ‘YY-MM-DD HH:MM:SS’ 二进制日志 | mysql(-uroot -p)
按文件大小还原:
–start-position
–stop-position
事务日志:记录事务相关的日志信息
中继日志:记录从服务器的备份信息

多机备份
主从配置:实时备份
主主配置:(互为主从)实时备份、负载均衡、高可用
多从一主:实时备份(更多的备份节点)
多主一从:实时备份、节约成本
读写分离:数据备份、负载均衡

mysql实验

1.创建登录用户

mysql>create user zhangsan@‘%’ identified by ‘123456’;
	%:指任意的远程终端

2.测试用户登录

# yum -y install mysql
# mysql -usans -p -h 192.168.88.10

3.用户为自己更改密码

set password=password(‘123456’);

4.root用户为其他用户找回密码

set password for sans@‘%’=password(‘123123’);

5.root找回自己的密码并修改
1)关闭数据库
2)修改主配置文件(/etc/myf)<------ skip-grant-tables
3)启动数据库
4)空密码登录并修改密码
update mysql.user set password=password(‘新密码’) where user=’root’;
5)删除skip-grant-tables,重启数据库验证新密码

数据库的增删改查

创建数据库

Mysql>create database web;
Mysql>show databases;

创建数据表

Mysql>use web;                       #选择要使用的数据库
Mysql>create table a1 (id int ,name char(30));      #创建a1表,并添加id和name字段以及类型
Mysql>describe a1;                     #查看表结构(字段)

复杂一点的

Mysql>create table a2 (
	->id int unsigned not null auto_increment, #字段要求为正数、且自增长、主键
	->name char(30) not null default ' ',    #字符型长度30字节,默认值为空格
	->age int not null default 0,            #字段默认值为0
	->primary key (id));                  #设置id为主键
Mysql> describe a2;   

插入数据

Mysql>insert into a2 (id,name,age) values (1,‘zhangsan’,21)#指明插入字段和数据
Mysql>select * from a2;
Mysql>insert into a2 values (2,‘lisi’,20)#按顺序插入指定字段
Mysql>insert into a2 values (4,‘zhao’,19)(5,‘sun’,25)#插入多条数据

将表a2的数据复制到表a1

Mysql>select * from a1;
Mysql>insert into a1 (id,name) select id,name from a2;          #查询a2值,并写入到a1
Mysql>select * from a1;

删除数据库

Mysql>drop database abc;
Mysql>show databases;

删除数据表

Mysql>drop table a1;
Mysql>show table;

删除表里的数据记录

Mysql>delete from a2 where id=5;                     #删除id=5的记录
Mysql>delete from a2 where age between 23 and 25;    #删除年龄在23-25之间的

修改表中的数据

Mysql>update a2 set age=21 where id=3;

修改数据表的名称

Mysql>alter table a2 rename a1;

修改数据表的字段类型

Mysql>describe a1;
Mysql>alter table a1 modify name char(50);
Mysql>describe a1;

修改数据表的字段类型详情

Mysql>describe a1;
Mysql>alter table a1 change name username char(50) not null default ‘’;
Mysql>describe a1;

添加字段

Mysql>describe a1;
Mysql>alter table a1 add time datetime;		#添加位置默认在末尾
Mysql>describe a1;		
Mysql>alter table a1 add birthday year first;       #添加字段到第一列
Mysql>alter table a1 add sex nchar(1) after id(表格最尾部的字符);     #添加到指定字段后

删除字段

Mysql>alter table a1 drop birthday;

Mysql用户授权
授予用户全部权限

Mysql>select user from mysql.user;
Mysql>grant all on aa.a1(库.表) to sans@‘%’;     #给已存在用户授权
Mysql>grant all on aa.a1(库.表) to abc@‘%’ identified by ‘123456’; #创建用户并授权

​ 取消abc用户的删除库、表、表中数据的权限

Mysql>revoke drop,delete on aa.a1(库.表) from abc@‘%’;       #取消删除权限(登录abc测试)
Mysql>show grants for abc@‘%’;                    #查看指定用户的授权
Mysql>show grants for sans@‘%’;               

Mysql备份和还原
把数据库 aa 备份到 /root 目录下

# mysqldump  -uroot  -p123456  -h192.168.128.55(本地登录不用写)  aa(库) > ~/aa.sql

​ 模拟数据库aa丢失(删除数据库aa)

​ 模拟数据库aa丢失(删除数据库aa)

	Mysql> drop database aa;

​ 通过aa.sql文件还原(指定导入到哪个库中)

# mysql –uroot –p test < aa.sql

​ 备份多个数据库(–databases)

# mysqldump –uroot –p --databases aa test > abc.sql

​ 还原(先模拟丢失)

# mysql –uroot –p < abc.sql

​ 备份有规则的数据库

Mysql>create database a1;     #连续创建三个a开头的数据库
# mysqlhotcopy --flushlog –u=‘root’ –p=‘456’ --regexp=^a

​ 还原(先模拟丢失)

Mysql>drop database a1;          #顺序删除a开头的数据库
# cp –a /mnt/* /var/lib/mysql/       #复制产生的文件到数据库目录下
#登录数据库查看即可

关于二进制日志还原

开启二进制日志
查看二进制日志文件

按时间还原:
1.如果数据库中的bb库被删,需要还原
2.查看二进制日志内容
3.还原并查看

mysqlbinlog --start-datetime=‘2018-09-11 14:24:00’ --stop-datetime=‘2018-09-11 14:28:00’ mysql-bin.000006 | mysql –uroot –p123123

注:所选时间段一定要完整包含所有动作(可以在原来基础上稍微增加点时间)

按文件大小还原:还原到bb库被删除的数据状态
1.查看bb库被删除前后的文件大小
2.还原并查看

三、Mysql实验

1、主从备份

前提条件:安装了mysql,开启了二进制日志

# vim /etc/myf
添加以下内容:
# log-bin=mysql-bin
# server-id=56(服务器ID)

启动 mysql

# service mysqld start

在主服务器上授权,从服务器保存授权的信息

主:
# grant replication slave on *.* to slave@'192.168.128.56' identified by '123456';
# show master status;  授权查看
从:
# change master to master_user='slave',master_password='123456',master_host='192.168.128.55',master_log_file='mysql-bin.000003',master_log_pos=260;


之后在 从服务器 /var/lib/mysql/ 会产生授权信息文件

开启从服务器 start slave , 并查看

# start slave;   启动
# show slave status\G;   查看从服务器内容

测试:在主服务器上创建库,从服务器上会同步出现主服务器所创建的库。

从服务器上创建表,主服务器上不会同步到。

2、主主备份

1.安装 mysql mysql-server

# yum -y install mysql mysql-server

以1为主,2为从配置一遍主从,在主配置文件中配置一下(开启二进制日志和其他内容)

1:
# vim /etc/myf
添加以下内容
log-bin=mysql-bin						#开启二进制日志文件
server-id=56
replicate-do-db=test					#默认绑定的同步数据库(不设置的话所有库都同步)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema		 #忽略掉,不进行二进制日志的记录
auto-increment-increment=2				#设置主键的自增幅度
auto-increment-offset=0					#设置主键的大小起始点

2.在2上做相同的配置

3.启动服务器 1 和 2

# service mysqld start

1为主2为从:在主服务器 1 上授权

# grant replication slave on *.* to slave@'192.168.128.56' identified by '123456';
# show master status;  授权查看

在从服务器 2 上保存授权信息

# show master status;
# change master to master_user='slave',master_password='123456',master_host='192.168.128.55',master_log_file='mysql-bin.000003',master_log_pos=106;

2 为主 1 为从:在主服务器 2 上授权

# grant replication slave on *.* to slave@'192.168.128.55' identified by '123456';

在从服务器 1 上保存授权信息

# show master status;
# change master to master_user='slave',master_password='123456',master_host='192.168.128.56',master_log_file='mysql-bin.000003',master_log_pos=265;

1 和 2 都执行 start slave(互为主从)

# start slave;   启动
# show slave status\G;   查看从服务器内容

测试:1 服务器创建表,2 服务器会同步到;2服务器创建表,1 服务器会同步到相应表。

3、一主多从

主服务器配置:开启二进制日志,并启动mysql

# vim /etc/myf
  log-bin=mysql-bin
  server-id=55
# service mysqld start

在主服务器上授权

# grant replication slave on *.* to slave@'%' identified by '123456';

从服务器配置:开启二进制日志,启动mysql

# vim /etc/myf
  server-id=55
# service mysqld start

保存授权信息

# show master status;
# change master to master_user='slave',master_password='123456',master_host='192.168.128.55',master_log_file='mysql-bin.000003',master_log_pos=265;

#在另一台 从服务器 上做相同的配置(注意id不能相同)

# service mysqld start		#启动mysql
# show master status;
# change master to master_user='slave',master_password='123456',master_host='192.168.128.55',master_log_file='mysql-bin.000003',master_log_pos=265;

测试:在主服务器上创建数据库,俩台从服务器均可同步到。

4、多主一从

主服务器配置:开启二进制日志,启动服务

# vim /etc/myf
  log-bin=mysql-bin
  server-id=55
# service mysqld start

授权

# grant replication slave on *.* to slave@'192.168.128.59' identified by '123456';

在主服务器2上做相同的操作

# vim /etc/myf
  log-bin=mysql-bin
  server-id=56
# service mysqld start

授权

# grant replication slave on *.* to slave@'192.168.128.59' identified by '123456';

从服务器操作:对主配置文件操作

# vim /etc/myf
添加以下内容:
[mysqld_multi]
mysqld=/usr/bin/mysqld_safe
mysqladmin=/usr/bin/mysqladmin
log=/var/log/multi.log

[mysqld55]
port=3306
datadir=/var/lib/mysql_55/
pid-file=/var/lib/mysql_55/mysqld.pid
socket=/var/lib/mysql_55/mysql.sock
user=mysql
server-id=59

[mysqld56]
port=3307
datadir=/var/lib/mysql_56/
pid-file=/var/lib/mysql_56/mysqld.pid
socket=/var/lib/mysql_56/mysql.sock
user=mysql
server-id=59

初始化数据库,生成目录 mysqla , mysqlb

# mysql_install_db --datadir=/var/lib/mysql_55 --user=mysql
# mysql_install_db --datadir=/var/lib/mysql_56 --user=mysql

注意:/var/lib/mysql_55,mysql_56目录及以下文件的属主为mysql(防止出现权限问题)

启动从服务器线程

# mysqld_multi --defaults-file=/etc/myf start 55
# mysqld_multi --defaults-file=/etc/myf start 56


从服务器登录并保存授权信息

从服务器3306:
# mysql -P 3306 -S /var/lib/mysql_55/mysql.sock
主1服务器:(这里主要是看日志编号与日志起始大小)
# show master status;
从服务器:
# mysql> change master to master_user='slave',master_password='123456',master_host='192.168.128.55',master_log_file='mysql-bin.000001',master_log_pos=260(来自主服务器);
# mysql> start slave;
# mysql> show slave status\G;

从服务器3307:
# mysql -P 3306 -S /var/lib/mysql_56/mysql.sock
主1服务器:(这里主要是看日志编号与日志起始大小)
# show master status;
从服务器:
# mysql> change master to master_user='slave',master_password='123456',master_host='192.168.128.56',master_log_file='mysql-bin.000001',master_log_pos=260(来自主服务器);
# mysql> start slave;
# mysql> show slave status\G;

测试:主1 服务器创建数据,从服务器同步,主2 服务器创建数据,从服务器同步。
注意:测试时需要从服务器分别登录服务器,否则只能看到一个主服务器所创建的数据。


5、读写分离

中间件:一种提供在不同技术、不同的软件之间共享资源的程序,更大化了利用了数据库的性能,可以无限扩展(注:真实环境中并非如此)
数据库的中间件: mysql proxy (官方版本) 性能低,需要lua脚本
atlas 性能低,响应时间长
amoeba 陈思儒研发的

一.先搭建一个主从关系的服务器,在主、从服务器上安装 mysql mysql-server

# yum -y install mysql mysql-server

1.开启二进制日志

# vim /etc/myf

2.在主服务器上授权,从服务器上保存授权信息,并开启从服务线程。

(55):授权
# grant replication slave on *.* to slave@'192.168.128.56' identified by '123456';
# show master status;
# grant replication slave on *.* to slave@'192.168.128.57' identified by '123456';
# show master status;(56):保存授权
# change master to master_user='slave',master_password='123456',master_host='192.168.128.55',master_log_file='mysql-bin.000003',master_log_pos=414;
# start slave;
# show slave status\G;(57):保存授权
# change master to master_user='slave',master_password='123456',master_host='192.168.128.55',master_log_file='mysql-bin.000003',master_log_pos=414;
# start slave;
# show slave status\G;

3.关闭从服务器线程,为了做读写分离时,测试有明显的实验效果(实际生产环境中不能停掉。。

# stop slave;

二、配置读写分离 (amoeba为例)

1.安装gcc环境(amoeba需要源码安装)

# yum -y install gcc* lrzsz

2.上传 amoeba 压缩包,解压缩到指定目录并改名,安装jdk(amoeba是由java语言编写的,所以先安装jdk)

# rz		#上传amoeba压缩包
# unzip amoeba-n.zip
# tar -xf amoeba-n/jdk-7u40-linux-x64.gz -C /usr/local/   #解压到指定目录下
# mv /usr/local/jdk1.7.0_40/ /usr/local/jdk		#改名
# chown -R root.root /usr/local/jdk

3.配置java环境,声明用java写出来的程序如何调用(/etc/profile)

# vim /etc/profile
结尾添加内容
#JAVA EXPORT
export JAVA_HOME=/usr/local/jdk
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/bin/tools.jar:$JAVA_HOME/lib/dt.jar
# source /etc/profile
# java -version		#测jdk可不可用,可用会显示版本号

4.安装amoeba

# unzip ~/amoeba-n/amoeba-mysql-1.3.1-BETA.zip -d /usr/local/amoeba		# -d 指定解压的目录并改名
# chmod -R +x /usr/local/amoeba/bin		#给执行权限方便命令的使用

5.配置amoeba这个软件。(删除注释,注意特别的注释,别误删)

# vim /usr/local/amoeba/conf/amoeba.xml


启动amoeba
1、修改一下启动脚本:/usr/local/amoeba/bin/amoeba 注意:将-Xss128k 修改为 –Xss256

# vim /usr/local/amoeba/bin/amoeba

2、在主和从服务器上进行指定用户授权,授权目的为了让amoeba能连接到主从服务器进行查询。

# grant all on test.* to user1@'192.168.128.55' identified by '123456';		#主从都执行

3、把这个放到后台 退出终端也可以继续运行

# nohup bash -x /usr/local/amoeba/bin/amoeba & 
# ps aux | grep amoeba   #查看一下运行的程序 查看到的话就说明程序已经运行了起来

测试(安装一个MySQL软件包才可以连接),在主、从服务器上创建表a1,在主服务器的表中插入数据,之后在客户端登录 amoeba 所在的服务器测试

读取池的效果:

写入池效果:
客户端:

主服务器端:

注意:以上测试纯粹为了实验效果,在实际生产中,主从开启,主服务器上写入的数据也会同步到从服务器中

更多推荐

数据库基础