zoukankan      html  css  js  c++  java
  • Linux系统管理之MySQL---未完

    01、编译安装MySQL

     

    1、准备工作

    -先查看当前系统是否有已安装mysql-server和mysql ----> rpm -qa | grep mysql 
    -若存在将其卸载 ----> rpm -e mysql-server mysql--nodeps 
    -安装ncurses-develcmake包 ----> yum -y install ncurses-devel 、 yum -y install cmake 
    -解压cmake包 ----> tar xf cmake-2.8.6.tar.gz -C /usr/src 
    -到解压cmake包的路径下 ----> cd /usr/src/cmake-2.8.6/ 
    -编译安装 ----> ./configure && gmake && gmake install

     

    2、源码编译及安装

    -添加程序用户mysql ----> useradd -M -s /sbin/nologin mysql 
    -解压mysql-5.5.22.tar.gz压缩包 ----> tar xf mysql-5.5.22.tar.gz -C /usr/src 
    cmake配置及安装 
    -进入mysql包的路径下 ----> cd /usr/src/mysql-5.5.22/ 
    -编译安装

    cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/etc -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all && make install 
    说明: 
    -DCMAKE_INSTALL_PREFIX=/usr/local/mysql 主程序安装目录 
    -DDEFAULT_CHARSET=utf8 默认字符集为utf8 
    -DDEFAULT_COLLATION=utf8_general_ci 默认字符集校对规则 
    -DWITH_EXTRA_CHARSETS=all 安装所有字符集 
    -DSYSCONFDIR=/etc 配置文件存放目录

     

    3、安装后优化操作

    -修改mysql安装目录的属主与属组 ----> chown -R mysql:root /usr/local/mysql 
    -创建修改my.cnf配置文件 ----> /bin/cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf

    my.cnf配置文件相关介绍,在mysql解压路径support-flies下提供模板: 模板名: my-huge.cnf 巨大数据量 
    my-innodb-heavy-4G.cnf innndb引擎 my-large.cnf 大数据量 my-medium.cnf 
    测试使用 my-small.cnf 小数据量

    添加系统服务

    cp support-files/mysql.server /etc/init.d/mysqld
    chmod +x /etc/init.d/mysqld
    chkconfig mysqld --add  (加入开机自启动)
    chkconfig mysqld --list (查看开机自启动程序)
    

    -添加MySQL命令执行的路径到PATH环境变量,目的是为了让环境变量能够找到mysql这个命令

    echo “export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile 或者 ln -s /usr/local/mysql/bin/* /usr/local/bin/  (做软连接)
    

    进行初始化数据库: 
    /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data

    只要出现两个ok就表示成功了。 /usr/local/mysql/data 数据目录,可以指定别的目录下,不要保存到系统盘上。

    -启动脚本 ----> /etc/init.d/mysqld start 
    -查看端口是否开启 ----> ss -antup | grep 3306 
    mysql的监听默认端口是3306

     

    4、连接并登录到mysql环境

    -激活mysql ----> mysql 
    -设置mysql密码 ----> mysqladmin -uroot password ‘密码’ 
    -非交互是登录 ----> mysql -uroot -p密码

    命令说明: 激活 mysql 参数 
    -h指定主机 
    -u指定用户名 
    -p指定密码 
    -P 指定端口 
    mysql -e指定命令,不进入mysql状态,查看数据信息 mysqladmin(管理员命令)

    注:mysql目录里面有个date目录是数据目录,bin目录是命令目录,support-file目录里提供了很多模板,比如启动脚本、配置文件。


     

    忘记MySQL超户密码的解决办法

    方法1:

    -暂停mysql服务 ----> /etc/init.d/mysqld stop 
    -跳过grant表授权,进入安全模式,并在后台运行 ----> mysqld_safe --skip-gtant-tables & 
    -查看当前已启动的作业 ----> jobs 
    -进入安全模式修改密码 ----> mysql 
    -启用mysql这个库 ----> use mysql 
    -更改密码 ----> update user set password=password('密码') where user='root'; 
    -刷新数据 ----> flush privileges; 
    -重启服务 ----> /etc/init.d/mysqld restart

    方法2:

    -进入mysql主配置文件 ----> vim /etc/my.conf 
    -第30行写数据 ----> skip_grant_tables 
    -重启服务 ----> /etc/init.d/mysqld restart 
    -进入mysql ----> mysql 
    -更改密码 ----> update user set password=password('密码') where user='root'; 
    -刷新数据 ----> flush privileges; 
    -退出mysql ----> exit 
    -进入mysql配置文件删除skip_grant_tables 
    --重启服务 ----> /etc/init.d/mysqld restart


     

    在MySQL数据库开启tab键补全功能

    -修改主配置文件 ----> vim /etc/my.cnf 
    image_1cqkqj2mn17qo4os2evf8k1eaeg.png-8.3kB

    -重启服务 ----> /etc/init.d/mysqld restart


     

    使MySQL数据库支持简体中文

    1、临时支持 ---->mysql ----->charset utf8

    2、永久支持 
    -yum安装mysqld服务 ----> yum -y install mysqld 
    -修改主配置文件 ----> vim /etc/my.cnf 
    微信图片_20181025133634.png-9.4kB

    -重启服务 ----> /etc/init.d/mysqld restart

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    02--数据库操作

     

    一、四种对表数据进行操作的SQL语句:

    SQL分类 DDL --->增删改---->库、表、索引--->create,drop 
    DML--->增删改--->数据--->insert,update,delete DQL--->查询数据--->select 
    DCL--->数据控制语言

    小库定义:就是data目录下的子目录,开发管小库叫做空间,小库的名字叫做空间名

     

    二、MySQL数据库、表的操作

    1、命令说明: 
    insert,update,delete 和 select 是对表里的数据进行操作用的,一般都是开发用,运维只需要掌握简单的四种即可,

    create--->建库建表
    drop database--->删库
    drop tables 库名.表名 --->删表
    show databases;--->查看所有数据库的小库名 (databases里最后一个s是复数的意思,我们查看很多小库就是看很多复数)
    use mysql;--->启用mysql库名的这个数据库
    show tables;--->查看数据库中的数据表信息
    describe 或者 desc 数据库.表名 ---> 显示数据表的字段
    insert into 库名.表名【字段1,字段2】values ('数值1','数值2')--->给表插入数据
    select 字段名 from 表名 --->查看表里的数据
    update 表名 set 字段=‘数值’ where 条件表达 --->更新表数据
    flush privileges --->刷新
    
     

    三、实例讲解

    1、看库: 
    先进入mysql 
    02.png-12.1kB

    2、查看数据库中的数据表信息 
    03.png-19.2kB

    3、查看数据表中的字段 
    04.png-16.6kB

    4、建库 
    先进入mysql 
    00.png-20.6kB

    5、建表 
    99.png-41.8kB

    例:建立公司技术部工资表 
    image_1cqqmrc6o1s5u1i401bt81pu6cele5.png-30.7kB

     

     

    6、删库 
    drop database 库名 
    image_1cqq6cc0gh4710qf66c14u7dm29.png-48.8kB

    7、删表 
    drop table 库名.表名; 
    image_1cqq6vp19erf46stn21pdu4m6m.png-52.4kB

    image_1cqq71h9rlh91bed6ho1gv01dv413.png-11.7kB

    8、表里插入数据 
    insert into 空间名.表名【字段1,字段2】values ('数值1','数值2')

    例1:一键插入数据,名字和密码 
    image_1cqq797ko147p1ef419i7lgk18im1g.png-35.3kB

    例2:指定字段输入数据 
    image_1cqq7ufbn8bq1gkt1n8o328cu42a.png-39.3kB

    例3:一键插入数据,名字和密码并把密码加密 
    image_1cqq7l5dddl11avg1lkk8ajflj1t.png-47.4kB

    9、查看表里的数据 
    select 字段名 from 表名

    例1:查看表里所有数据 
    image_1cqq83bkc3061hg1ive1v34ibv2n.png-31.5kB

    例2:查看表里指定数据 
    image_1cqq8auii1dicp5g15e71o9kqvp44.png-19.9kB

    注*表示所有数据

    10、更新表数据 
    updata 表名 set 字段=‘数值’ where 条件表达

    例1:表示把数据库表里所有密码字段改为888888 (不加条件默认全改) 
    image_1cqq8i2u51hmq14ek7hrhrp1l2e4h.png-62.4kB

    例2:表示把数据库表里名字是lisi的密码改为666666 ,where表示指定更改的条件 
    image_1cqq8ons4juuqhs8u1g1712o54u.png-57.9kB

    例3:修改mysql登录root密码并加密 然后 flush privileges 刷新 
    image_1cqq9q4in1t7b1n91sbv1hn617a45b.png-80.8kB

    11、删除表里数据 
    delete from 表名 条件表达式 或 delete from 空间名.表名 条件表达式 ---不加条件表示清空表里的所有数据。 
    例:表示清空lisi这个所有数据 
    image_1cqqa1lb11rrodv6almbclnu668.png-47.9kB

     

    四、用户权限设置

     

    命令

    grant 授权 
    show grants 查看用户权限 
    查询指定账户的权限 show grants for '账号名'@'ip'

    1、设置用户权限(用户不存在是,则新建用户)

    grant all on . to 'yunjisuan'@'192.128.200.128' identified by '123456'; 说明: 
    1、 'root'@'192.128.1.108' 用户名@登录IP 账号 '123456' 密码 
    2、all 类型-----所有权限 > select delete update insert 读、写、更新、插入 
    3、*.* 所有的库和所有的表 
    4、to 指定账号,将前面所有权限和所有的库和所有的表付给后面的账号 
    5、identified by 设置指定的密码 

    image_1cqqadtii1pof1o2j16t8lil10ao6l.png-46.3kB

    2、新起一台虚拟机,安装Msql让其可以支持远程连接

    3、用客户端登录服务端的数据库

    【3.1】在服务端给另一台主机授权

     image_1cqqcll6p1m451ctp2of2v4to372.png-12.4kB
    【3.2】远程登录,ip必须指定服务端的ip地址。即使在本地也要指定远程登录,表示在本机上以远程的方式登录本机,本地登录是localhost(127.0.0.1) 
    image_1cqqcpu4mrpskl0nqq1ar61qjs7f.png-11.5kB

    image_1cqqcv5jbmg5ucf1d5315v9beg7s.png-23.1kB

    【3.3】在服务端开通一个账号可以以本地方式登录服务器的数据库 
    image_1cqqd6tgd1594anna9aduu1g5n89.png-29.3kB
    【3.4】flush privileges 服务端数据库刷新

    注:以上ip一定要注意,必须是前面的账号,指定登录位置的ip地址。你登录谁就写谁的ip 
    4、查询权限,show grants 查询当前用户权限 
    5、查询指定账户的权限 show grants for '账号名'@'ip'


     

    指定权限

    1、grant all on mysql.* to 'bent'@'192.128.1.108' identified by'123456'; (服务端操作)
    表示授权mysql库里的所有表给后面账号所有权限
    2、flush privileges  刷新
    3、show grants for '账号名'@'ip'   查询指定账户的权限
    

     

    指定读权限

    1、grant select on mysql.* to 'bent'@'192.128.1.108' ; (服务端操作,由于刚从已经对这个用户设定过密码,所以不用在设定了)
    表示只给该用户读去mysql库里所有表的权限权限
    

     

    撤销权限

    1、revoke select on mysql.* from '用户名'@'ip'
    表示撤销用户名对mysql库里的所有表的读权限
    

     

    Mysql通配符

    _ 表示任意单个字符
    %表示任意长度的字符
    例1、bent'@'192.128.200.%' 表示bent用户所有200网段的ip
    例2、bent'@'192.128.200.10_'表示bent用户所有200网段的101-109的ip
    

     

    Mysql密码修改

    登录mysql修改mysql.user表内的root用户密码
    update muusql.user set password=password('要改的密码') where user='root'
    

     

    命令补充:

    show status;用于显示广泛服务器状态信息
    help create database;显示创建特定数据库
    help create tables;显示创建特定的表
    show grants;显示授权用户的安全权限
    show errors;和 show warnings;显示服务器错误或警告信息
    mysql>select user(); 显示当前连接用户
    mysql>select now(); 显示当前时间
    mysql>select CURRENT_USER(),CURRENT_TIMESTAMP; 和 mysql>select user(),now(); 显示当前用户及时间
    mysql>select database(); 显示当前数据库
    mysql>select status;显示服务器状态

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    03、Mysql数据库完全备份与恢复

    一、数据库备份分类 
    1、完全备份:对整个数据库的备份、数据库结构和文件结构的备份,保存的的备份完成时刻的数据库,是差异备份与增量备份的基础。 
    优点:备份与恢复操作简单方便 
    缺点:数据存在大量的重复;占用大量的空间;备份与恢复时间长 
    以上,小企业每天回进行一次全备。 
    2、增量备份:只备份上次完全备份或增量备份后被修改的文件才会备份。 
    优点:备份数据量小,占用空间小,备份速度快。 
    缺点:恢复时,需要从上一次的完整备份起到最后一次增量备份一次恢复,如中间某次的备份数据损坏,将导致数据的丢失。 
    以上,大企业每周一次全备,每天一次增备


    二、命令 
    1、msqldump 完全备份(会锁表,用户会写不进数据,不能在主库上做) 参数 --databases 告诉后面的字符都是库名 -opt加快备份速度 
    备份方式有两种,1、命令备份。2、打包data目录备份(需要停库)

    例1:命令备份(单库备份) 
    将root用户的yunjisuan这个库的表按时间备份到/backup 
    image_1cqqgqmnq1hf81e8h1a1d2lem888m.png-19.8kB

    例2:命令备份(多库备份) 将root用户的yunjisuan和yunjisuan1的库按时间备份到/backup 
    image_1cqqhm4b8q451ka9hkd61a1sbk93.png-24.4kB

    例3:命令备份(全库备份) 将root用户的所有库加快备份速度按时间备份到/backup 
    image_1cqqi6ge9iuj11tg10jr7ks1snd9g.png-25.2kB

    例4:命令备份(备份单表) 将root用户的yunjisuan这个库下的yun表按时间备份到/bachup 
    image_1cqqih2373jo2p81fpb1qca142h9t.png-25.3kB


    2、恢复命令 source 
    例1:source 备份文件路径 (全备恢复,进入数据库操作,交互式) 
    image_1cqqkakh41f9u1c22gmp11h9d3gaa.png-35kB

    image_1cqqkftjqfhk1ska13815ra362an.png-28.8kB

    image_1cqqkhj8k1qhg90cj041it29njbk.png-13.5kB

    例2:mysql -uroot -p666666 库名< 备份文件的路径 (全备恢复,非交互式) 
    image_1cqqkpqh8q0req3aus46m1j04c1.png-55.1kB

    image_1cqqks9tjoil6r17r01kkne98cu.png-13.4kB


    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    04、事务索引

    一、数据库索引概述:

    1、数据库索引 
    在数据库种,索引使数据库程序无须对整个表进行描述,就可以在其中找到所有数据。数据库的索引是某个表种一列或者若干列值的集合,以及物理标识这些值的数据页的逻辑指针清单。

    2、索引的作用 
    【1】设置了合适的索引之后,数据库利用各种快速的定位技术,能够大大加快查询速度率,特别是当表很大时,或者查询涉及到多个表时,使用索引可以时查询加快成千倍。 
    【2】可以降低数据库的IO成本,并且索引还可以降低数据量的排序成本。 
    【3】通过创建唯一性索引保证数据表数据的唯一性,可以加快表与表之间的链接。 
    【4】在使用分组和排序时,可大大减少分组和排序时间。

    3、索引的分类 
    【1】普通索引 
    这是最基本的索引类型,而且没有唯一性之类的限制 
    【2】唯一性索引 
    与普通索引基本相同,区别在于;索引列的所有值都只能出现一次,即必须唯一,但可以为空。 
    【3】主键 
    是一种特殊的唯一索引,必须指定为“PBRIMARY KEY”,具有唯一性的同时不能为空。 
    【4】全文索引 
    MySQL从3.23.23版本开始支持全文索引和全文检索。在MySQL中,全文索引的类型为FULLTEXT,全文索引可以在VARCHAR或者TEXT类型的列上创建。贴吧的文本内容,和一些小型的网站网页内容,存放在数据量中即为全文索引模式。 
    【5】单列索引与多列索引 
    索引可以是单列上创建的索引,也可以是多列上创建的索引。

    4、事务索引 
    事务是一种机制,一个操作序列,包含了一组数据库操作命令,并且报所有的命令作为一个整体一起向系统提交或者撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。 
    事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。 
    事务适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等,通过事务的完整性以保证数据的一致性。

    二、事务

    1、概念:事务是一种机制,一个操作序列,包含了一组数据库操作命令,并且报所有的命令作为一个整体一起向系统提交或者撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。 
    事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。 
    事务适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等,通过事务的完整性以保证数据的一致性。

    2、事务的四个属性: 
    原子性 
    一致性 
    隔离性 
    持久性

    【2.1】原子性:事务是一个完整的操作,事务的各元素是不可分的(原子的),事务的所有元素必须操作为一个整体提交或回滚。如果事务中的任何元素失败,则整个事务将失败。

    【2.2】一致性:当事务完成时,数据必须处于一致状态:在事务开始之前,数据库汇总存储的数据处于一致状态;在正在进行的事务中,数据可能处于不一致的状态;当事务完成时,数据必须在次回到已知的以致状态。

    【2.3】隔离性:对数据进行修改的所有并发事务的彼此隔离的,这表明事务必须是独立的,他不应该以任何方式依赖于或影响其他事务。修改数据的事务可以在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据。

    【2.4】持久性:书屋的持久性指不管系统是否发生了故障,事务处理大的结果都说永久的,一旦事务被提交,事务的效果会被永久的保留在数据库中。


     

    三、事务实例

    例1:开启一个事务 
    image_1cqqrm9t91sfq1hub1p1p8v31f2jgj.png-42.4kB

    例2:提交一个事务 
    image_1cqqrqcrj1i33100g1p3e197c1qldh0.png-24.8kB

    例3:回滚,撤销之前的sql语句 
    image_1cqqs3beq1v5uh88lp10gl1so0hd.png-39.6kB 
    image_1cqqs625a5vq1jjd1jer1lahjethq.png-27.7kB

    例4:使用set命令进行控制提及方式 
    image_1cqqsedou1rvt1k6g8ek1ekaco8i7.png-10.2kB

    命令说明; 
    begin 开启事务 ; 
    commit 提交一个事务; 
    rollback 回滚,撤销之前的sql语句 ; 
    set autocommit=0关闭自动提交。1为开启。 
    查询默认配置,show variables like ‘autocommit’

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    05、账号管理

    1、新建用户 
    格式:create user '用户名'@'来源ip' identified by password('密码'); 
    例: 创建一个yunjisuan的用户密码是123456,所有网段的 
    image_1cqquklps1dv7tmi1b6kmu7jrsjk.png-57.4kB
    测试登录 
    image_1cqqunckf1ifegh41gbj1qg910c4k1.png-34.9kB

    2、删除用户 
    格式:drop user ‘用户名’@'来源ip' 
    例:删除一个yunjisuan的用户 
    image_1cqqur5k4drk1rfm1mb21f00ihske.png-9kB

    image_1cqqutr571l1np0r17vr1geh1o1umb.png-39.4kB

    测试 
    image_1cqqv1ea6i4g1fhu3881ve6u8mmo.png-26kB

    3、重命名修改主机 
    格式:rename user '源用户名'@'源ip' to '新用户名'@'新ip' //可以只改用户或主机 
    创建一个:create user 'yunjisuan'@'%' identified by '123456' ; 
    例1:修改用户名 
    image_1cqqvch4s1j8r24l19jjg1k1v12n5.png-92.2kB

    例2:修改ip 
    image_1cqqvlgnp1fl9122c138rrs71v6jo2.png-93.4kB

    例3:修改用户名和ip 
    image_1cqqvs1n84kp1tttr611h8l1kavof.png-99.9kB

    4、给用户设置密码 
    格式:set password=password('密码');为当前登录的用户改密码 
    set password for '用户'@'ip' =password('密码');为其他用户设置密码

    例1、给yunjisuan用户设置密码 
    image_1cqr07bvst58lej1cm11snnptsos.png-13.4kB
    image_1cqr09kph16hei2cic11rqhlbkp9.png-33.2kB 
    测试 
    image_1cqr0begjh6juc26ppqfc4n5pm.png-21.8kB

     

    image_1cqr0d265h1uki5ijc168a14m5q3.png-46kB

     

    06、增量备份与恢复

     

    一、MySQL日志包括

    1、错误日志 
    2、通用查询日志 
    3、二进制日志

     二、MySQL二进制日志对备份的意义

    1、二进制日志保存了所有更新或者可能更新数据库的操作。 
    2、二进制日志在启动MySQL服务器后开始记录,并在文件达到max_binlog_size所设置的大小或者接收到flush logs命令后重新创建新的日志文件。 
    增量备份的日志mysqlbinlog,max_binlog_size 二进制日志默认1M


     

    三、增量备份步骤

    命令:mysqlbinlog 读取二进制日志文件 flush logs;强制刷新日志文件(mysql里操作) 
    1、开启二进制日志功能,开启MySQL的二进制日志功能。 
    vim /etc/my.cnf 开启log-bin=mysql-bin 表示开启二进制日志 
    或者mysql的配置文件的【mysqld】中加入log-bin=文件存放路径文件前缀,如log-bin=mysql-bin 
    2、重启mysqld服务

    image_1cqsb5bgafon1q7e10gc1btaoa19.png-38.2kB

    3、一般恢复,备份二进制日志内容全部恢复 
    mysqlbinlog 增量备份文件 | mysql -u 用户名 -p 密码

    image_1cqsgsofg1li5p3ndk3mfd1hq31t.png-33.6kB

    image_1cqsh0v45qv9vponhebm41ih12a.png-49kB

    image_1cqsh2ds916mo1iluf1s1hvsba82n.png-15.8kB

    image_1cqshs5bb197ah0h4lcpog1bg334.png-16.2kB

    image_1cqshuiefbm71fvt21gdd1j633h.png-26.8kB

    4、从日志开头截止到某个时间点的恢复: 
    mysqlbinlog --stop-datetime=‘年-月-日 小时:分钟:秒’二进制日志 | mysql -u 用户名 -p 密码

    5、从某个时间点到日志结尾的恢复 
    mysqlbinlog --start-datetime ‘年-月-日 小时:分钟:秒’二进制日志 | mysql -u 用户名 -p 密码

    6、从某个时间点到某个时间点恢复 
    mysqlbinlog --start-datetime ‘年-月-日 小时:分钟:秒’--stop-datetime=‘年-月-日 小时:分钟:秒’二进制日志 | mysql -u 用户名 -p 密码

    7、基于位置的恢复,更加精准 
    show master status 先查询下当前位置在哪 
    mysqlbinlog --start-position='操作 id’二进制日志 | mysql -u 用户名 -p 密码 
    mysqlbinlog --stop-position='操作 id’二进制日志 | mysql -u 用户名 -p 密码

    image_1cqsibsrkqci1e1njldjo38at3u.png-45.8kB

    image_1cqsidod81un117fva85acu89d4b.png-13.2kB

    image_1cqsion8516cjoei1p79srl1ma04o.png-26kB

     ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    07、MySQL主从复制

     

    一、主从复制的原理:

    主库Master有个MySQL主进程也就是socket进程,和IO线程,从库上有三个进程,一个主进程和一个IO线程和一个SQL线程。开始复制时候从库开启一个IO线程,来监控主库的binlog日志,一旦主库的binlog日志有数据变化,从库和主库的两个IO线程就会发生数据交换,从库的IO线程会找主库的IO线程申请验证。验证通过后,从库里的SQL进程会查看中继日志,将中继日志中的二进制翻译成一条一条的SQL语句,执行到从库的MySQL备份目录里,从而完成主从复制的过程。

     

    二、如何实现复制的:

    主库流程: 
    1、主库打开binlog日志 
    用户先在主库的data目录里写一句话,就会被IO线程将用户写的SQl语句,记录在二进制日志里(binlog)

    2、主库在主库里创建主从复制账号。用于从库的IO线程进行验证。

    3、server id号设置成1

    从库流程: 
    1、开启中继日志,语句:relay-log=relay-bin

    2、主从复制验证信息录入。

    3、在从库上激活主从复制。

    4、验证通过后,主IO线程,会把binlog日志复制给从库的IO线程,从库的IO线程会把复制过来的数据放在一个叫做中继日志里(relay-bin)

    5、从库设置server id

     

    注,他们会有个server id号,并且不能相同,主的id号默认是1,从的随意

     

    详细讲解:

    1、从IO找主IO申请验证 
    验证信息有: 
    【1】、主库ip和主库的soket进程端口 
    【2】、主库的复制账号和密码 
    【3】、复制哪个二进制文件的名字 
    【4】、二进制文件中postion具体位置之后开始复制

    2、主IO线程把从IO线程想要复制的二进制文件名字和具体想从二进制文件中哪个位置之后开始复制的信息复制出来给从的IO线程

    3、在给从IO线程一个截至本次复制数据的位置,和一个新的binlog日志信息

    4、从库记录复制哪个二进制文件的名字和二进制文件中postion具体位置开始复制的信息放在master.info里面。

    5、从把复制得内容放在中继日志里

    6、从的SQL线程记录之前写到中继日志文件及哪个中继日志文件里面的位置信息记录在relay-log.info文件里

    7、SQL线程开始解析并写进数据库。 
    工作中实现主从复制时候先将主库数据全备导出,所以我们实验时候也先用全备导出。


     

    命令一览:

    set global sql_slave_skip_counter=1 将sql线程同步指针向下移动一个,如果多次不同步,可以重复操

     

    主从复制实战

    主从复制时两个库的数据必须一致 
    1、开启binlog日志和serverid 
    image_1cqvbp7kruki1tbgvi61acq7n936.png-43.7kB

    2、重启mysqld服务 
    image_1cqvbs5va1ogi13bg192ibh47oq3j.png-11.5kB

    3、检查系统变量是否正确 
    image_1cqvc2mhhuegfr11opg5jt5hn50.png-24.9kB

    4、在主库上建立用于主从复制的账号 
    image_1cqvd0quai6ron8ih8bmjarv5d.png-53.9kB

    语句说明:
    1)replication slave为mysql同步的必须权限,此处不要授权all权限 
    2)*.* 表示所有库所有表,也可以指定具体的库和表进行复制。例如yunjisuan.test中,yunjisuan为库名,test为表名 
    3)'yunjisuan'@'192.168.200.%' yunjisuan为同步账号。192.168.200.%为授权主机网段,使用了%表示允许整个192.168.200.0网段可以用yunjisuan这个用户访问数据库 
    4)identified by '123123';  123123为密码,实际环境下设置的复杂些为好
    

    5、刷新权限,使授权的权限生效 
    image_1cqvd8imt1vl81bcvmj012ribuo5q.png-9.4kB

    6、实现对主数据库锁表只读 
    image_1cqvdgqs313auuaa1hot1p21lp267.png-37.4kB

    7、新开SSH窗口打包导出主库数据 
    image_1cqvdsebl2gg1fhj1t8rbir44974.png-48.3kB

    -A表示备份所有库;-B表示增加use DB和 drop 等(导库时会直接覆盖原有的)
    为了确保导出数据期间,数据库没有数据插入,导库完毕可以再次检查主库状态信息,结果如下:show master status查看位置信息要于第7步相同
    

    8、导出数据完毕后,解锁主库,恢复可写 
    image_1cqve43s0gk01it7fgdrss1t478e.png-11.3kB

    ---在MySQL从库上执行的操作过程 
    9、设置server-id值并关闭binlog功能参数,参数要放在my.cnf中的[mysqld]模块下 
    微信图片_20181029162604.png-62.3kB

    10、重启从库的mysqld服务 
    微信图片_20181029162845.png-6.9kB

    11、登录数据库检查参数改变情况 
    image_1cqvfodu8ij4ob765pk2a1gkofj.png-28.1kB

    12、授权主库root账号可以管理从库数据库 
    image_1cqvgcegtdlj16ha3s6ufu1or9gg.png-30.4kB

    13、把从主库mysqldump导出的数据恢复到从库 
    image_1cqvgh8871q0s1hru1cjc1btnh6ht.png-22.9kB

    image_1cqvgknve1beq164t1ca914u8o5lia.png-19.3kB

    14、登陆从库,配置复制参数 
    image_1cqvh86kr131pkf31bkcnlf1e9min.png-50kB

    15、启动从库主从复制开关,并查看复制状态 
    image_1cqvhcqnh17igsjoaou1mj11bfnj4.png-9.1kB

    image_1cqvhfffnjbc31s1fok1n321u8qjh.png-24.3kB

    1】Slave_IO_Running: Yes,这个时I/O线程状态,I/O线程负责从从库到主库读取binlog日志,并写入从库的中继日志,状态为Yes表示I/O线程工作正常。
    2】Slave_SQL_Running: Yes,这个是SQL线程状态,SQL线程负责读取中继日志(relay-log)中的数据并转换为SQL语句应用到从数据库中,状态为Yes表示I/O线程工作正常。
    3】Seconds_Behind_Master:0,这个是复制过程中从库比主库延迟的秒数,这个参数极度重要,但企业里更准确地判断主从延迟的方法为:在主库写时间戳,然后从库读取时间戳,和当前数据库时间进行比较,从而认定是否延迟。
    

    16、测试 
    image_1cqvhne6p1qoq133a1m57bmhvr9ke.png-46.1kB
    image_1cqvi0n181p6g124bcorv9a1649nb.png-61.7kB

     
  • 相关阅读:
    【算法每日一练】LeetCode02 两数之和
    【算法每日一练】LeetCode01 两数之和
    【算法题】09-单链表翻转
    【算法题】08- 构造数组的MaxTree
    【算法题】07-生成窗口最大值数组
    【算法题】06-用栈来解决汉诺塔问题
    【算法题】05-用一个栈实现另一个栈的排序
    【算法题】04-猫狗队列
    【算法题】03-使用递归和栈逆序一个栈
    【算法题】02-使用两个栈实现队列额的功能
  • 原文地址:https://www.cnblogs.com/mendermi/p/9835564.html
Copyright © 2011-2022 走看看