Mysql进阶(一)

2016/11/16
查询mysql的安装目录
	ps -ef | grep mysql  或者  ps -aux  | grep mysql
mysql配置文件
	日志
		log-bin=mysql-bin  二进制日志文件
		log-error 错误日志
		查询日志
	数据文件
		系统数据库位置
			windows
				安装目录\data目录下可以挑选很多库
			linux
				安装目录/lib/mysql
		数据文件
			frm文件 存放表结构
			myd文件 存放表数据
			myi文件 存放表索引
		配置文件
			windows
				my.ini文件
			linux
				/etc/my.cnf 文件
mysql逻辑架构介绍
	插件式的存储引擎架构将查询处理和其它的系统任务以及数据的储存提取相分离。
	这种框架可以根据业务的需求和实际需求选择合适的储存引擎。
	Mysql分为三层结构
		1.连接层
			最上层是一些客户端和连接服务,包含本地sock通信和大多数基于客户端/服务器工具实现的类似于tcp/ip通信。
			主要完成一些类似于连接处理、授权认证、及相关的安全方案。在改层上引入了线程池的概念,为通过认证安全
			接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接,服务器也会为安全接入的每个客户端验证它
			所具有的操作权限。
		2.服务层
			第二层框架主要完成大多数的核心服务功能,如SQL接口、并完成缓存查询,SQL的分析和优化及部分内置函数的执行,
			所有夸存储引擎的功能也在这一层实现,如过程、函数、在该层、服务器会解析查询并创建相应的内部解析树,并对
			其它相应的优化如确定查询表的顺序,是否利用引擎等,最后生成相应的执行操作。如果是select语句,服务器还会
			查询内部的缓冲,如果缓存空间足够大,这样在解决大量读操作的环境中能够很好的提升系统的性能。
		3.引擎层
			存储引擎层,存储引擎真正的负责了MySQL中数据的存储和提取。服务器通过API与存储引擎进行通信,不同的储存引
			擎具有的功能不同,这样我们可以根据自己的实际需求进行选取。
			默认的引擎是InnoDB
			show engines  查看当前引擎

PERFORMANCE_SCHEMA | YES     | Performance Schema                                         | NO           | NO   | NO
InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES          | YES  | YES
MRG_MYISAM         | YES     | Collection of identical MyISAM tables                      | NO           | NO   | NO
MyISAM             | YES     | MyISAM storage engine                                      | NO           | NO   | NO
CSV                | YES     | CSV storage engine                                         | NO           | NO   | NO
MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables  | NO           | 
			查看mysql当前默认的存储引擎
				show variables like '%storage_engine%';
					+------------------------+--------+
					| Variable_name          | Value  |
					+------------------------+--------+
					| default_storage_engine | InnoDB |
					| storage_engine         | InnoDB |
					+------------------------+--------+
			MyISM和InnoDB引擎对比
对比项		MyISM					InnoDB
主外键		不支持					支持
事务		不支持					支持
行表锁		表锁,即使操作一条记录也会锁住整个表	行锁,操作时只锁某一行,不对其它行有影像,
		不适合高并发操作,			适合搞并发
缓存		只缓存索引,不缓存真实数据		不仅缓存索引还要缓存真实数据,对内存要求较高,
							而且内存大小对性能有决定性的影响,
表空间		小					大
关注点		性能					事务
默认安装	Y					Y
		4.存储层
			数据存储层,主要是将数据存储在运行于裸设备文件系统之上,并完成于存储引擎的交互。
mysql性能因素
	1.业务需求对mysql的影响
	2.存储定位对mysql的影响
	3.Schema设计对系统的性能影响
	4.硬件环境对系统性能的影响
性能下降SQL慢
	执行时间长
	等待时间长
常见通用的调优方式
	SQL JOIN
		SQL执行顺序
			机器读
				FROM
				ON
					JOIN
				WHERE
				GROUP BY
				HAVING
				SELECT
				DISTINCT
				ORDER BY
					LIMIT
			SQL Join
				inner join  on 内连接
				outer join on 外连接 
				left  join  on 左
				right join  on 右
	索引优化
		优势
			平常如果没有特别指明,都是指B+树结构组织的索引。	
			加快查询的速度,较低对数据进行排序成本
		劣势
			较低了表的更新速度,在操作Mysql数据库时,还要保存一下索引文件每次更新添加了索引列的字段。
			如果有大数据量的时候,还需要研究建立最优秀的索引。
		mysql索引结构
			BTree索引
			Hash索引
			fulll-text全文索引
			R-Tree索引
	性能分析
		MySQL Query Optimizer
			1.Mysql中有专门负责优化SELECT语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息,为客户端
			请求的Query提供他认为最优的执行计划(他认为最优的数据检索方式,但不见得DBA认为是最优的,这部分最耗费时间)
			2.当客户端向MYsql请求一条Query,命令解析器模块完成请求分类,区别出SELECT并转发给MySQL Query Optimizer时,
			MySQL Query Optimizer首先会对整条Query进行优化,处理掉一些常量表达式的预算,直接换算成常量值。并对Query中的
			查询条件进行简化和转换,如去掉一些无用或显而易见的条件、结构调整等。然后分析Query中Hint信息,看显示Hint信
			息是否可以完成确定该Query的执行计划,如果没有Hint或Hint信息还不足以完全确定执行计划,则会读取所涉及对象的
			统计信息,根据Query进行写相应的计算分析,
			然后再得出最后的执行计划。
		MYSQL常见瓶颈
			CPU:CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候
			IO:磁盘I/O瓶颈发生在装入数据远大于内存容量的时候
			服务器硬件的性能瓶颈:top.free.iostat来查看系统
			性能
		Explain
			使用Explain关键字可以模拟优化器执行SQL查询语句,从而直到MySQL是如何处理你的SQL语句,分析你的查询语句或是表
			结构的性能瓶颈。
			作用:
				1、分析表的读取顺序
				2、数据读取操作的哦操作类型
				3、那些索引可以使用
				4、那些索引被实际使用
				5、表之间的引用
				6、每张表有多少行被优化器查询
			包含:
				id select_type table type possible_keys key key_len ref rows Extra
				id
					查询的序列中,包含一组数字,表示查询中执行select字句或操作表的顺序。
					三种情况
						id 相同,执行顺序由上到下
						id 不同 如果是子查询,id的序号会增加,id值越大优先级越高,越先被执行
						id 相同不同同时存在 derived 衍生
				select_type
					simple 简单select 查询,查询中不包含子查询或者UNION
					primary 查询中包含任何复杂的子部分,最外层查询则被标记
					subquery 在select或where列表中包含了子查询
					derived 在from列表中包含的子查询被标记为derived(衍生mysql会递归执行这些
						子查询,把结果放在临时空间中
					union 若第二个select出现在uninon后,则被标记为uninon;若union包含在From
						子句的子查询中,外层select将被标记为:derived
					union result 从union表获取结果的select
				type 访问;类型 一般最好达到range,最好达到ref 
					all < index < range < ref <  eq_ref < const,system null

					system
						表中只有一行记录(等于系统表),这是const类型的特例,平时不会出现,
						这个也可以忽略不计
					const
						表示通过索引一次就找到了 const 用于比较primary key 或者unique序列,
						因为只匹配一行数据,所以很快 如将主键置于where列表中,Mysql就能将该查询
						转换为一个常量
					eq_ref
						唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见于主键或
						唯一索引扫描
					ref
						非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回
						所有匹配某个单独值的行。然而它可能会找到多个符合条件的行所以他应该属于查询和扫描的混合体
					range
						只检索给定范围的行,使用一个索引来选择行,key列显示使用了哪个索引一般就是在where语句中
						出现between < > in 等的查询 这种范围扫描扫描比全表扫描要好,因为它只需要开始于索引的
						某一点,而结束语另一点,不用扫描全表。
					index
						full index scan index与all区别为index类型只遍历索引树,这通常比all快,因为索引文件通常比数据文件小
						(也就是说all与index都是读取全表,但是index是从索引中读取的,而all是慈宁宫磁盘中读取的)
					all 
						full table scan 将遍历全表以找到匹配的行
				possible_keys	
					显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上若存在索引,则改索引将被列出。
				key	
					实际使用的索引,如果为null,则没有使用索引。查询中若使用了覆盖索引则该索引仅出现在key列表中
				key_len
					表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失精确性的情况下,长度越短越好
					key_len 显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,
					不是通过表内检索出的
				ref
					显示索引的那一列被使用了,如果可能的话,是一个常量,哪些列或常量被用于查找索引列上的值
				rows
					根据表统计信息及索引选用情况,大致估算出找到所需的记录所需读取的行数
				extra
					包含在不适合在其他列中显示的信息。
					Using filesort
						说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行排序,
						 Mysql中无法利用索引完成的排序。
					Using temporary 
						使用了临时表保存中间结果,Mysql在对查询结果排序时使用临时表,常见与order by
						和group by 
					Using index
						表示相应的select操作中使用了覆盖索引(Covering index),避免访问了表的数据行,
						效率不错!如果同时出现using where 表明索引被用来执行索引键值的查找
						如果没有时间同时出现using where ,表明索引用来读取数据而非执行查找动作,
	索引优化技巧
			1.range 类型查询字段右面的复合索引无效。解决方法 修改索引
			2.left join 的时候 索引建立在右表中
			3.尽可能减少Join语句中的NestedLoop的循环总次数:“永远用小结果集驱动大的结果集”
			  优先优化NestedLoop的内层循环,保证Join语句中被驱动表上的Join条件已经被索引
			  当无法保证被驱动表的join条件字段被索引内存资源存足的前提下,不要太吝啬JoinBugger的设置。
			4.复合索引查询字段完全匹配最优
			5.复合索引要遵循“最佳左前缀,带头大哥不能丢,中间不能断”
			6.不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
			7.mysql在使用不等于(!= 或者 <> 的时候无法使用索引会导致全表扫描)
			8.is null is not null 也会导致索引无法使用
			9.like 以通配符查询的也会导致全表扫描的操作 把%写在右面 
			10.字符串不加单引号索引也会失效
			11.少用or,用它来连接时会索引失效
	show profile mysql用来分析当前会话中语句执行的资源消耗情况,可以用于SQL的调优的测量
		默认情况下,参数处于关闭状态,并保存最近15次的运行结果
			1.是否支持 Show variables like 'profiling'; 
			2.开启功能 set profiling=on;
			3.运行SQL  
			4.查看结果  show profiles;
			5.诊断SQL 
				show profile cpu,block io for query 12;
			6.日常开发需要注意的结论
				converting heap to MyISAM
					查询结果太大,内存都不够用了往磁盘上搬了。
				create tmp table 创建临时表
				Copying to tmp table on disk 把内存临时表复制到磁盘
				locked
	查询优化
			1.order by 关键字优化 
				尽量使用index与顺序方式排序,避免使用FileSort方式排序 
					“最佳左前缀,带头大哥不能丢,中间不能断”  *它会按照索引的创建顺序排序进行调用*
				Mysql支持两种方式排序 FileSort 和Index
					FileSort是值按照列本身排序进行(单列排序和双列排序)
						单列排序优化策略
							增大数据库max_length_for_sort_data参数的设置
								不管用哪种算法,提高这个参数会提高效率,当然,要根据系统的能力去提高,
								因为这个参数是针对每个进程的
							增大sort_buffer_size参数的设置
								提高这个参数会提高算法的概率,但是如果设置的太高,数据总容量超出sort_buffer_size
								的概率就会增大,明显症状是高的磁盘IO获取和低的处理器使用率
			2.group by 关键字优化 
				实质是先排序后进行分组,遵循索引顺序的最佳左前缀
				当无法使用索引列,增大数据库max_length_for_sort_data参数的设置,和增大sort_buffer_size参数的设置
				where高于having,能写在where限定的条件就不要去having限定了
分区分库分表
分区  partition
		逻辑数据分割
		提高单一的写和读应用速度
		提高分区范围读查询的速度
		分割数据能够有多个不同的物理文件路径
		高效的保存历史数据
	1.查看mysql是否支持分区功能
		show variables like '%partition%'
		show plugins;
	2.mysql分区类型
		range分区
			原理:
				mysql将会根据指定的拆分策略,把数据放在不同的表文件上,相当于在文件上,
				被拆成了小块,但是对外给客户的感觉还是一张表,透明的。
			操作
				create table tab_new(
					id int,
					name varchar(20)
				)engine myisam charset utf8
				partition by range(id)(
					 partition t0 values less than(10), #id 小于10的 找t0区域
					 partition t1 values less than(20), #id 小于20的 找t1区域
					 partition t2 values less than(MAXVALUE) #id 大于20的 找t2区域;
				);
		list 分区
			原理:
				list分区在很多方面类似于Range分区,和按照range分区一样,每个分区必须明确定义
				它们的主要区别在于,List分区中每个分区的定义和选择是基于某列的值从属于一个值列表中
				的一个值,而range分区时从属于一个连续区间值的集合。
			操作
				create table area(
					id int,
					name varchar(20)
				)engine myisam charset utf8;

				create table usr(
					id int,
					name varchar(20),
					area_id int
				)engine myisam charset utf8
				partition by list(area_id)(
					partition by values in(1),
					partition sh values in(2),
					partition hz values in(3)
				);
		hash 分区
		key 分区
		子分区
分库
	数据库集群环境后都是多台slave,基本满足了读取操作,但是写入或者说大数据,频繁的写入操作对master性能影响比较大,
	这个时候。单库并不能解决大规模并发写入的问题。
	优点:
		减少增量数据写入时的锁对查询的影响。
		由于单表数量下降,常见的查询操作由于减少了需要扫描的记录,使得单表单次查询所需的检索行数减少,减少了磁盘的IO操作,
		延时变短,但是它无法解决单表数据量太大的问题。
	通常是将表功能模块化,关系密切程度划分出来,部署到不同库上。
分表
	垂直拆分
		比如说 用户表把登录信息 划分出去登录表		
	水平拆分
		比如说 	按照日期的方式新建表
	    开源方案拆分策略:
		MYsql Fabric 高可用性和自动分片
		Atlas 360
		TDDL
		MYSQl proxy 基本都用现在公司中

Mysql锁机制
	锁是计算机协调多个进程或线程并发访问某一资源的机制。
	锁的分类
		1.从对数据操作类型读\写分
			读锁(共享锁)
				针对同一份数据,多个读操作可以同时进行而不会互相影响。
			写锁(排他锁)
				当前写操作没有完成前,它会阻塞其他写锁和读锁

		2.从数据操作的力度
			表锁
			行锁
	MYsql锁机制
		1.表锁(偏向读)
			特点:
				偏向MYIsam索引引擎,开锁小,加锁快,无死锁;锁定颗粒大,发生锁冲突的概率高,并发度低。

			操作:
				手动增加锁
					lock table 表名 read,表名2 write;
				查看表上加过的锁
					show open tables;
				释放表锁
					unlock tables;
			总结:	读锁会阻塞写,但是不会堵塞读,而写锁会把读和写都堵塞。
				a.对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求,
				  只有当读锁释放后,才会执行其它进程的写操作,
				b.对MyIAN表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行
				  其它进程的读写操作,
			分析:
				如何分析表锁定
					可以通过table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定。
					show status like 'table%'
				两个状态变量记录Mysql表锁定的情况table_locks_waited和table_locks_immediate
					table_locks_immediate 
						产生表锁定的次数,表示可以立即获取锁的查询次数,每立即获取
						锁值加1;
					table_locks_waited
						出现表锁定争用而发生等待的次数(不能立即获取锁的次数,没等待一次锁值加1)
						此值高则说明存在着较严重的表级锁争用情况。
					此外,Myisam的读写锁调度是写优先,这也是myisam不适合做写为主表的引擎,因为写锁后,
					其他线程不能做任何操作,大量的更新会使得查询很难得到锁,从而造成永远阻塞。
					
		2.行锁(偏向写)
			特点:
				偏向InnoDB索引引擎,开销大,加锁慢,会出现死锁,锁定粒度最小,发生锁冲突的概率低,
				并发度也最高。
			行锁支持事务
				ACID
					原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
			隔离级别
		隔离级别	数据一致性					脏读	不可重复读	幻读
		未提交读	最低级别,只能保证不读取物理上损坏的数据        是	 是		 是
		已提交读	语句级						否       是		 是
		可重复读	事务级						否       否		 是
		可序列化	最高级别,事务级				否	 否		 否
			操作:
				Innodb引擎插入表后默认开启了事务与行锁。
			问题:	
				1.无索引使得行锁升级为表锁
				2.间隙锁危害
			分析:
				查询innnoDB_row_lock锁的争夺请款
					 show status like 'innodb_row_lock%'
				各个状态量说明如下
					innnoDB_row_lock_current_waites 当前正在等待锁定的数量
					innnoDB_row_lock_time 从系统启动到现在锁定总时间长度
					innnoDB_row_lock_avg 每次等待所平均时间
					innnoDB_row_lock_max 从系统启动到现在等待最长的一次时间
					innnoDB_row_lock_waits 系统启动后现在总共等待的次数
		3.页锁
			开销和加锁事假介于表锁和行锁之间,会出现死锁,锁定颗粒度介于表锁和行锁间,并发度一般。

Mysql主从复制
	Mysql复制过程
		1.master将改变记录到二进制日志(binary log),这些记录叫做二进制日志事件,binary log events
		2.slave将master的binary log events 拷贝到他的中继日志(relay log)
		3.slave重做中继日志中的事件。将改变应用到自己的数据库中,Mysql复制时异步的且串行化的
	一主一从常见配置
		配置 以下内容参考与  http://www.osyunwei.com/archives/7269.html 系统运维

		操作系统:CentOS 5.x 64位

		MySQL数据库版本:mysql-5.5.35

		MySQL主服务器:192.168.21.128

		MySQL从服务器:192.168.21.129

		准备篇:

		说明:在两台MySQL服务器192.168.21.128和192.168.21.129上分别进行如下操作

		备注:

		作为主从服务器的MySQL版本建议使用同一版本!

		或者必须保证主服务器的MySQL版本要高于从服务器的MySQL版本!

		一、配置好IP、DNS 、网关,确保使用远程连接工具能够连接服务器

		二、配置防火墙,开启3306端口

		vi /etc/sysconfig/iptables  #编辑

		-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT  #允许3306端口

		特别提示:如果这两条规则添加到防火墙配置的最后一行,导致防火墙启动失败,
		正确的应该是添加到默认的22端口这条规则的下面,添加好之后防火墙规则如下所示:

		#########################################################

		# Firewall configuration written by system-config-securitylevel

		# Manual customization of this file is not recommended.

		*filter

		:INPUT ACCEPT [0:0]

		:FORWARD ACCEPT [0:0]

		:OUTPUT ACCEPT [0:0]

		:RH-Firewall-1-INPUT - [0:0]

		-A INPUT -j RH-Firewall-1-INPUT

		-A FORWARD -j RH-Firewall-1-INPUT

		-A RH-Firewall-1-INPUT -i lo -j ACCEPT

		-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT

		-A RH-Firewall-1-INPUT -p 50 -j ACCEPT

		-A RH-Firewall-1-INPUT -p 51 -j ACCEPT

		-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT

		-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT

		-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT

		-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

		-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

		-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

		-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

		COMMIT

		#########################################################

		/etc/init.d/iptables restart #最后重启防火墙使配置生效

		三、关闭SELINUX

		vi /etc/selinux/config

		#SELINUX=enforcing #注释掉

		#SELINUXTYPE=targeted #注释掉

		SELINUX=disabled #增加

		:wq  #保存退出

		setenforce 0 #立即生效

		四 、系统约定

		软件源代码包存放位置:/usr/local/src

		源码包编译安装位置:/usr/local/软件名字

		五、下载软件包

		1、下载MySQL

		http://cdn.mysql.com/Downloads/MySQL-5.5/mysql-5.5.35.tar.gz

		2、下载cmake(MySQL编译工具)

		http://www.cmake.org/files/v2.8/cmake-2.8.12.1.tar.gz

		以上软件包上传到/usr/local/src目录

		六、安装编译工具及库文件(使用CentOS yum命令安装)

		yum install -y make apr* autoconf automake curl curl-devel gcc gcc-c++ gtk+-devel
		zlib-devel openssl openssl-devel pcre-devel gd kernel keyutils patch perl kernel-headers compat*
		 cpp glibc libgomp libstdc++-devel keyutils-libs-devel libsepol-devel libselinux-devel krb5-devel  libXpm* 
		 freetype freetype-devel freetype* fontconfig fontconfig-devel  libjpeg* libpng* php-common php-gd gettext 
		 gettext-devel ncurses* libtool* libxml2 libxml2-devel patch policycoreutils bison

		安装篇

		说明:在两台MySQL服务器192.168.21.128和192.168.21.129上分别进行如下操作,安装mysql-5.5.35

		以下是远程登录到服务器,在命令行下面操作的

		一、安装cmake

		cd /usr/local/src

		tar zxvf cmake-2.8.12.1.tar.gz

		cd cmake-2.8.12.1

		./configure

		make #编译

		make install #安装

		二、安装mysql

		groupadd mysql  #添加mysql组

		useradd -g mysql mysql -s /bin/false  #创建用户mysql并加入到mysql组,不允许mysql用户直接登录系统

		mkdir -p /data/mysql  #创建MySQL数据库存放目录

		chown -R mysql:mysql /data/mysql   #设置MySQL数据库目录权限

		mkdir -p /usr/local/mysql-5.5.35 #创建MySQL安装目录

		ln -s /usr/local/mysql-5.5.35 /usr/local/mysql  #创建软连接到mysql目录,方便后面的配置

		cd /usr/local/src

		tar zxvf mysql-5.5.35.tar.gz  #解压

		cd mysql-5.5.35

		cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql  -DMYSQL_DATADIR=/data/mysql  -DSYSCONFDIR=/etc   #配置

		make #编译

		make install  #安装

		cd /usr/local/mysql
		#拷贝配置文件(注意:如果/etc目录下面默认有一个my.cnf,直接覆盖即可)
		cp ./support-files/my-huge.cnf  /etc/my.cnf   

		vi /etc/my.cnf   #编辑配置文件,在 [mysqld] 部分增加

		datadir = /data/mysql  #添加MySQL数据库路径

		./scripts/mysql_install_db --user=mysql  #生成mysql系统数据库

		cp ./support-files/mysql.server  /etc/rc.d/init.d/mysqld  #把Mysql加入系统启动

		chmod 755 /etc/init.d/mysqld   #增加执行权限

		chkconfig mysqld on  #加入开机启动

		vi /etc/rc.d/init.d/mysqld  #编辑

		basedir = /usr/local/mysql   #MySQL程序安装路径

		datadir = /data/mysql  #MySQl数据库存放目录

		service mysqld start  #启动

		vi /etc/profile   #把mysql服务加入系统环境变量:在最后添加下面这一行

		export PATH=$PATH:/usr/local/mysql/bin

		source  /etc/profile #使配置立即生效

		下面这两行把myslq的库文件链接到系统默认的位置,这样你在编译类似PHP等软件时可以不用指定mysql的库文件地址。

		ln -s /usr/local/mysql/lib/mysql /usr/lib/mysql

		ln -s /usr/local/mysql/include/mysql /usr/include/mysql

		mkdir /var/lib/mysql  #创建目录

		ln -s /tmp/mysql.sock  /var/lib/mysql/mysql.sock   #添加软链接

		mysql_secure_installation   #设置Mysql密码,根据提示按Y 回车输入2次密码

		/usr/local/mysql/bin/mysqladmin -u root -p password "123456"   #或者直接修改密码

		到此,mysql安装完成!

		配置篇

		一、配置MySQL主服务器(192.168.21.128)

		mysql -u root -p  #进入MySQL控制台

		create database osyunweidb;   #建立数据库osyunweidb
		 #创建用户osyunweiuser,密码123456

		insert into mysql.user(Host,User,Password) values('localhost','osyunweiuser',password('123456'));  
		#授权用户osyunweiuser从192.168.21.130完全访问数据库,注意:这里的192.168.21.130是要连接数据库Web服务器IP
		grant all on osyunweidb.* to 'osyunweiuser'@'192.168.21.130' identified by '123456' with grant option;  
		#建立MySQL主从数据库同步用户osyunweidbbak密码123456
		insert into mysql.user(Host,User,Password) values('localhost','osyunweidbbak',password('123456'));  

		flush privileges;   #刷新系统授权表
		 #授权用户osyunweidbbak只能从192.168.21.129这个IP访问主服务器192.168.21.128上面的数据库,并且只具有数据库备份的权限
		grant replication slave  on *.* to 'osyunweidbbak'@'192.168.21.129' identified by '123456' with grant option; 

		二、把MySQL主服务器192.168.21.128中的数据库osyunweidb导入到MySQL从服务器192.168.21.129中

		1、导出数据库osyunweidb
	          #在MySQL主服务器进行操作,导出数据库osyunweidb到/home/osyunweidbbak.sql
		mysqldump -u root -p --default-character-set=utf8 --opt -Q -R --skip-lock-tables osyunweidb > /home/osyunweidbbak.sql  

		备注:在导出之前可以先进入MySQL控制台执行下面命令

		flush tables with read lock;    #数据库只读锁定命令,防止导出数据库的时候有数据写入

		unlock tables;   #解除锁定
		#把home目录下的osyunweidbbak.sql 数据库文件上传到MySQL从服务器的home目录下面
		scp /home/osyunweidbbak.sql [email protected]:/home   

		系统运维  www.osyunwei.com  温馨提醒:qihang01原创内容 版权所有,转载请注明出处及原文链接

		2、导入数据库到MySQL从服务器

		mysql  -u root -p  #进入从服务器MySQL控制台

		create database osyunweidb;   #创建数据库

		use osyunweidb    #进入数据库

		source  /home/osyunweidbbak.sql  #导入备份文件到数据库

		mysql -u osyunweidbbak -h 192.168.21.128 -p  #测试在从服务器上登录到主服务器

		三、配置MySQL主服务器(192.168.21.128)的my.cnf文件

		vi /etc/my.cnf   #编辑配置文件,在[mysqld]部分添加下面内容

		server-id=1   #设置服务器id,为1表示主服务器,注意:如果原来的配置文件中已经有这一行,就不用再添加了。

		log-bin=mysql-bin  #启动MySQ二进制日志系统,注意:如果原来的配置文件中已经有这一行,就不用再添加了。

		binlog-do-db=osyunweidb  #需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行

		binlog-ignore-db=mysql   #不同步mysql系统数据库

		:wq!   #保存退出

		service mysqld  restart  #重启MySQL

		mysql -u root -p   #进入mysql控制台

		show variables like 'server_id';  #查看server-id的值是否为1

		mysql> show variables like 'server_id';

		+---------------+-------+

		| Variable_name | Value |

		+---------------+-------+

		| server_id     | 1     |

		+---------------+-------+

		1 row in set (0.00 sec)

		show master status;  #查看主服务器,出现以下类似信息

		mysql> show master status;

		+------------------+----------+--------------+------------------+

		| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

		+------------------+----------+--------------+------------------+

		| mysql-bin.000011 |      107 | osyunweidb   | mysql            |

		+------------------+----------+--------------+------------------+

		1 row in set (0.00 sec)

		注意:这里记住File的值:mysql-bin.000011和Position的值:107,后面会用到。

		四、配置MySQL从服务器(192.168.21.129)的my.cnf文件

		vi /etc/my.cnf   #编辑配置文件,在[mysqld]部分添加下面内容

		server-id=2   #设置服务器id,修改其值为2,表示为从数据库

		log-bin=mysql-bin  #启动MySQ二进制日志系统,注意:如果原来的配置文件中已经有这一行,就不用再添加了。

		replicate-do-db=osyunweidb   #需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行

		replicate-ignore-db=mysql   #不同步mysql系统数据库

		read_only  #设置数据库只读

		:wq!    #保存退出

		service mysqld restart   #重启MySQL

		mysql  -u root -p  #进入MySQL控制台

		show variables like 'server_id';  #查看server-id的值,必须为上面设置的2,否则请返回修改配置文件

		mysql> show variables like 'server_id';

		+---------------+-------+

		| Variable_name | Value |

		+---------------+-------+

		| server_id     | 2     |

		+---------------+-------+

		1 row in set (0.01 sec)

		slave stop;   #停止slave同步进程

		change master to master_host='192.168.21.128',master_user='osyunweidbbak',master_password='123456',
		master_log_file='mysql-bin.000011' ,master_log_pos=107;    #执行同步语句

		slave start;    #开启slave同步进程

		SHOW SLAVE STATUS\G   #查看slave同步信息,出现以下内容

		mysql> SHOW SLAVE STATUS\G

		*************************** 1. row ***************************

		Slave_IO_State: Waiting for master to send event

		Master_Host: 192.168.21.128

		Master_User: osyunweidbbak

		Master_Port: 3306

		Connect_Retry: 60

		Master_Log_File: mysql-bin.000011

		Read_Master_Log_Pos: 107

		Relay_Log_File: mysqlslave-relay-bin.000004

		Relay_Log_Pos: 253

		Relay_Master_Log_File: mysql-bin.000011

		Slave_IO_Running: Yes

		Slave_SQL_Running: Yes

		Replicate_Do_DB: osyunweidb

		Replicate_Ignore_DB: mysql

		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: 107

		Relay_Log_Space: 560

		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: 1

		1 row in set (0.00 sec)

		mysql>

		注意查看:

		Slave_IO_Running: Yes

		Slave_SQL_Running: Yes

		以上这两个参数的值为Yes,即说明配置成功!

		测试篇

		测试MySQL主从服务器是否正常运行

		1、进入MySQL主服务器(192.168.21.128)

		mysql -u root -p  #进入MySQL控制台

		use osyunweidb   #进入数据库

		CREATE TABLE test ( id int not null primary key,name char(20) );   #创建test表

		2、进入MySQL从服务器

		mysql -u root -p  #进入MySQL控制台

		use osyunweidb   #进入数据库

		show  tables;  #查看osyunweidb表结构,会看到有一个新建的表test,表示数据库同步成功

		mysql> show  tables;

		+----------------------+

		| Tables_in_osyunweidb |

		+----------------------+

		| test                 |

		+----------------------+

		1 row in set (0.00 sec)

你可能感兴趣的:(Database)