以下所有的实操都是在redhat7.3上操作
MySQL (关系型数据库管理系统)的基础知识
1.什么是数据库?
数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作所谓“数据库”是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合
2.什么是数据库管理系统?
数据库管理系统(英语:Database Management System,简称DBMS)是为管理数据库而设计的电脑软件系统
一般具有存储、截取、安全保障、备份等基础功能。
数据库管理系统可以依据它所支持的数据库模型来作分类,例如关系式、XML;
或依据所支持的计算机类型来作分类,例如服务器群集、移动电话;
或依据所用查询语言来作分类,例如SQL、XQuery;
或依据性能冲量重点来作分类,例如最大规模、最高运行速度;
亦或其他的分类方式。不论使用哪种分类方式,一些DBMS能够跨类别,例如,同时支持多种查询语言。
3.数据库的分类
<1>关系数据库
MySQLMariaDB(MySQL的代替品,英文维基百科从MySQL转向MariaDB)Percona Server(MySQL的代替品·)PostgreSQLMicrosoft AccessMicrosoft SQL ServerGoogle Fusion TablesFileMakerOracle数据库SybasedBASEClipperFoxProfoshub
几乎所有的数据库管理系统都配备了一个开放式数据库连接(ODBC)驱动程序,令各个数据库之间得以互相集成。
<2>非关系型数据库(NoSQL)
BigTable(Google)CassandraMongoDBCouchDB键值(key-value)数据库Apache Cassandra(为Facebook所使用):高度可扩展DynamoLevelDB(Google)
4.数据库模型
对象模型层次模型(轻量级数据访问协议)网状模型(大型数据储存)关系模型面向对象模型半结构化模型平面模型(表格模型,一般在形式上是一个二维数组。如表格模型数据Excel)
5.数据库架构
数据库的架构可以大致区分为三个概括层次:内层、概念层和外层。
内层:最接近实际存储体,亦即有关数据的实际存储方式。外层:最接近用户,即有关个别用户观看数据的方式。概念层:介于两者之间的间接层。
6.数据库索引
数据索引的观念由来已久,像是一本书前面几页都有目录,目录也算是索引的一种,只是它的分类较广,例如车牌、身份证字号、条码等,都是一个索引的号码,当我们看到号码时,可以从号码中看出其中的端倪,若是要找的人、车或物品,也只要提供相关的号码,即可迅速查到正确的人事物。另外,索引跟字段有着相应的关系,索引即是由字段而来,其中字段有所谓的关键字段(Key Field),该字段具有唯一性,即其值不可重复,且不可为"空值(null)"。例如:在合并数据时,索引便是扮演欲附加字段数据之指向性用途的角色。故此索引为不可重复性且不可为空。数据库操作:事务
7.数据库事务
事务(transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
事务的ACID特性:
事务的ACID特性:
原子性(atomicity):一个事务是一个不可分割的最小工作单位,事务中的所有操作要么都做,要么都不做。
一致性(consistency):事务前后数据的完整性必须保持一致.事务必须是使数据库从一个一致性状态变到另一个一致性状态,一致性与原子性是密切相关的。
隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。有四种隔离级别
持久性(durability):指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
隔离性的四种级别
8.什么是mysql?
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品
MySQL 是最流行的关系型数据库管理系统之一
在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一
MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中
而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言
MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点
一般中小型网站的开发都选择 MySQL 作为网站数据库
由于其社区版的性能卓越,搭配 PHP 和 Apache 可组成良好的开发环境
关于mysql数据库集群的英文文档
一、MySQL 主从复制(异步复制)概念
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
二、MySQL 主从复制主要用途
1. 读写分离
在开发工作中,有时候会遇见某个sql 语句需要锁表,导致暂时不能使用读的服务,这样就会影响现有业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。
2. 数据实时备份,当系统中某个节点发生故障时,可以方便的故障切换
3. 高可用HA
4. 架构扩展
随着系统中业务访问量的增大,如果是单机部署数据库,就会导致I/O访问频率过高。有了主从复制,增加多个数据存储节点,将负载分布在多个从节点上,降低单机磁盘I/O访问的频率,提高单个机器的I/O性能
三、MySQL 主从复制原理
MySQL主从复制涉及到三个线程,一个运行在主节点(log dump thread),其余两个(I/O thread, SQL thread)运行在从节点,如下图所示:
更细致的解读mysql主从复制原理
主节点 binary log dump 线程
当从节点连接主节点时,主节点会创建一个log dump 线程,用于发送bin-log的内容。在读取bin-log中的操作时,此线程会对主节点上的bin-log加锁,当读取完成,甚至在发动给从节点之前,锁会被释放。
从节点I/O线程
当从节点上执行start slave
命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-log。I/O线程接收到主节点binlog dump 进程发来的更新之后,保存在本地relay-log中。
从节点SQL线程
SQL线程负责读取relay log中的内容,解析成具体的操作并执行,最终保证主从数据的一致性。
对于每一个主从连接,都需要三个进程来完成。当主节点有多个从节点时,主节点会为每一个当前连接的从节点建一个binary log dump 进程,而每个从节点都有自己的I/O进程,SQL进程。从节点用两个线程将从主库拉取更新和执行分成独立的任务,这样在执行同步数据任务的时候,不会降低读操作的性能。比如,如果从节点没有运行,此时I/O进程可以很快从主节点获取更新,尽管SQL进程还没有执行。如果在SQL进程执行之前从节点服务停止,至少I/O进程已经从主节点拉取到了最新的变更并且保存在本地relay日志中,当服务再次起来之后,就可以完成数据的同步。
要实施复制,首先必须打开Master 端的binary log(bin-log)功能,否则无法实现。
因为整个复制过程实际上就是Slave 从Master 端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。如下图所示:
复制的基本过程如下:
从节点上的I/O 进程连接主节点,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;主节点接收到来自从节点的I/O请求后,通过负责复制的I/O进程根据请求信息读取指定日志指定位置之后的日志信息,返回给从节点。返回信息中除了日志所包含的信息之外,还包括本次返回的信息的bin-log file 的以及bin-log position;从节点的I/O进程接收到内容后,将接收到的日志内容更新到本机的relay log中,并将读取到的binary log文件名和位置保存到master-info 文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log 的哪个位置开始往后的日志内容,请发给我”;Slave 的 SQL线程检测到relay-log 中新增加了内容后,会将relay-log的内容解析成在祝节点上实际执行过的操作,并在本数据库中执行。
四、实现Mysql主从复制(基于position的主从复制)
异步复制:当数据复制一半,master卡死,那么数据就会丢失;master和slave不是同步的;
单向复制,只能slave复制master的,即slave对master库只读
在master(server1)配置:
mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar安装包下载
[root@server1 ~]# cd mysql_inst/[root@server1 mysql_inst]# lsmysql-5.7.24-1.el7.x86_64.rpm-bundle.tar[root@server1 mysql_inst]# tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar #解压mysql安装包 [root@server1 mysql_inst]# ls[root@server1 mysql_inst]# rpm -qa |grep mariadb #查看是否存在mariadbmariadb-libs-5.5.52-1.el7.x86_64[root@server1 mysql_inst]# yum install -y mysql-community-client-5.7.24-1.el7.x86_64.rpm mysql-community-common-5.7.24-1.el7.x86_64.rpm mysql-community-libs-5.7.24-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm mysql-community-server-5.7.24-1.el7.x86_64.rpm[root@server1 mysql_inst]# rm -fr mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar mysql-community-devel-5.7.24-1.el7.x86_64.rpm mysql-community-embedded-5.7.24-1.el7.x86_64.rpm mysql-community-embedded-compat-5.7.24-1.el7.x86_64.rpm mysql-community-embedded-devel-5.7.24-1.el7.x86_64.rpm mysql-community-minimal-debuginfo-5.7.24-1.el7.x86_64.rpm mysql-community-server-minimal-5.7.24-1.el7.x86_64.rpm mysql-community-test-5.7.24-1.el7.x86_64.rpm
[root@server1 mysql_inst]# scp * server2: #将其安装包发给server2[root@server1 mysql_inst]# scp * server3:[root@server1 mysql_inst]# vim /etc/flog-bin=mysql-bin #启用二进制功能,主从复制基础server-id=1 #id唯一,id不一样,刚好避免了死循环复制,看到id不一样,直接丢弃不一样的事务
[root@server1 mysql_inst]# cd /var/lib/mysql[root@server1 mysql]# ls #mysql下无任何文件[root@server1 mysql]# systemctl start mysqld #启动mysql服务;[root@server1 mysql]# ls
[root@server1 ~]# grep password /var/log/mysqld.log #获得初始密码
[root@server1 ~]# mysql_secure_installation #重新设置root密码;
[root@server1 ~]# mysql -uroot -pWang+123 #登录数据库mysql> CREATE USER
epl@172.25.70.% IDENTIFIED BY Wang+123; #创建用户;mysql> GRANT REPLICATION SLAVE ON *.* TO
epl@172.25.70.%; # 为服务器创建一个连接账户并授予权限,*.*表示所有权限;172.25.70.%表示这个网段的所有用户都有这个权限mysql> SHOW DATABASES;
mysql> USE mysqlmysql> select * from tables_priv;mysql> show master status;当前正在使用的二进制日志文件
测试:在server3上,在server2上也可以;[root@server3 ~]# mysql -h 172.25.70.1 -urepl -pWang+123 mysql> show databases;#远程登录,但是不能查看数据库; 测试成功
mysql> quit
在slave(server2)配置:
[root@server2 ~]mkdir mysql_inst[root@server2 mysql_inst]# tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar #解压mysql安装包 [root@server2 mysql_inst]# yum install -y mysql-community-client-5.7.24-1.el7.x86_64.rpm mysql-community-common-5.7.24-1.el7.x86_64.rpm mysql-community-libs-5.7.24-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm mysql-community-server-5.7.24-1.el7.x86_64.rpm
[root@server2 mysql_inst]# vim /etc/f;server-id=2
[root@server2 mysql_inst]# systemctl start mysqld #重启服务[root@server2 mysql_inst]# cd /var/lib/mysql[root@server2 mysql]# ls[root@server2 mysql]# grep password /var/log/mysqld.log[root@server2 mysql]# mysql_secure_installation[root@server2 ~]# mysql -uroot -pWang+123 #登录数据库mysql> show databases;mysql> CHANGE MASTER TO-> MASTER_HOST=172.25.70.1,-> MASTER_USER=
epl,-> MASTER_PASSWORD=Wang+123,-> MASTER_LOG_FILE=mysql-bin.000002,-> MASTER_LOG_POS=1834;mysql> start slave; #表示同时启动i/o线程和SQL线程;I/O线程从主库读取mysql-bin .log并存储到server-relay-bin. log中继日志文件中;SQL读取server-relay-bin. log中继日志,解析后,在从库重放;mysql> show slave status\G;
这步不操作,只是为了说明stop slave的含义;*****************************************mysql> stop slave #完成停止I/O线程和SQL线程;******************************************
在master(server1)上创建数据库:
mysql&
MySQL数据库集群——MySQL的异步复制(基于position的主从复制和基于gtid的主从复制) 半同步复制 组复制