MySQL笔记(未完)

数据库

数据库简单地分为两种:

  1. 关系型数据库---->MySQL和Oracle
  2. 非关系型数据库---->Memcached 和Redis
  3. 消息队列中间列

关系型数据库 SQL数据库
数据和数据之间是有关系的。通过关系能够将一系列数据都提取出来。

非关系型数据库 NoSQL数据库 (Not only SQL)

关系型数据库MySQL和Oracle区别
其实,这两类数据库在使用方式上,大体是没有太多区别。都是基于SQL查询方式的数据库。但是Oracle是闭源的,也就是收钱的,收了钱自然就好办事,出了问题,有人管。因此,运维并不需要花费太多精力在Oracle上 。要学,去企业学。
MySQL呢?是开源的,免费用的。免费的东西自然是需要我们运维来维护的。但是通常来说,真正的数据库维护人员的职位叫做DBA=database administrator,他并不是广泛意义上的运维。只是数据库专业运维。对于广泛意义上的运维维护人员来说,我们在2万薪资以下只需要简单了解MySQL。

市面上还有一种数据库,关系型,叫做MariaDB。
MySQL数据库最早是开源的,当然现在也是开源的。但是,MySQL已经被Oracle公司===>SUN,他被收购了。那么,MySQL一旦闭源了,怎么办?因此MySQL运维社区的人,为了防止SUN公司对MySQL进行闭源操作,他们自主在MySQL最后一个开源版本的基础上,开放出来了一个分支数据库,叫做MariaDb。其实他和MySQL是几乎一样的。

B/S架构模式与C/S架构模式的区别
B/S==>Web/Server
用户通过Web浏览器打开输入域名就能访问服务器Server的方式叫B/S,
用户不需要安装任何东西
C/S==>Client/Server
所谓客户端Client在用户的电脑是需要下载并安装的。

编译安装MySQL

  1. rpm -qa | grep mysql
    查看电脑里有没有mysql,如果有mysql-server删除
    rpm -e mysql-server --nodeps

  2. 安装ncurses-devel与cmake
    yum -y install ncurses-devel
    cmake需要编译 需要cmake-2.8.6包
    tar xf cmake-2.8.6.tar.gz -C /usr/src/
    cd /usr/src/cmake-2.8.6
    ./configure && gmake && gmake install

  3. 安装MySQL
    tar xf mysql-5.5.22.tar.gz -C /usr/src/
    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 && make install

  4. 创建mysql程序用户
    useradd -M -s /sbin/nologin mysql
    bin命令目录 data数据目录 support files 提供了很多模板比如启动脚本和 配置文件 scripts 脚本

  5. 修改mysql安装目录的属主和属组
    cd /usr/local/ chown -R mysql:root /usr/local/mysql

  6. 创建修改my.cnf配置文件
    /bin/cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf
    my-huge.cnf 巨大数据量 my-innodb-heavy-4G.cnf innodb引擎
    my-large.cnf 大数据量 my-medium.cnf 测试使用 my-small.cnf 小数据量

  7. 设置启动脚本
    /bin/cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
    启动脚本
    chmod +x /etc/init.d/mysqld
    chkconfig mysqld --add
    chkconfig mysqld --list

  8. 添加MySQL命令执行的路径到PATH环境变量
    echo “export PATH=$PATH:/usr/local/mysql/bin” >>/etc/profile
    也可以创建软连接
    ln -s /usr/local/mysql/bin/* /usr/local/bin/

  9. 执行mysql_install_db 脚本初始化数据库
    /usr/local/mysql/scripts/mysql_install_db --user=mysql
    –basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

  10. 启动mysql服务 mysql端口3306
    /etc/init.d/mysqld start
    netstat -antup | grep 3306

  11. 连接并登陆mysql
    -h 指定主机 不写默认本地 -P 端口 默认3306 -p指定密码
    设置mysql密码
    mysqladmin -uroot password ‘102846’
    mysql用户有两部分组成
    用户名@登陆的IP
    mysql -uroot -p102846

数据库操作

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

##建库、删库、建表、删表、查库、查表
show databases;查看数据库列表信息
use 数据库民; 使用库
show tables;查看数据库中的数据表信息
create database 数据库名;创建数据库
drop database 数据库名;删除数据库
create table users(user_name char(20) not null,user_passwd char(30) default ‘’,primary key(user_name)); 创建表 char字符 not null 不能为空 default ‘’默认为空,primary索引关键字
describe 表名; 显示表的字段(结构) 可以简写 desc 表名;
drop table 表名;删除表

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

增:insert into 表名[字段名] values 具体数值
删:delete from 表名 where 条件
改:update 表名 set 字段=’数值’
查:select 字段名 from 表名


insert into users values (‘xiaohong’,‘666666’);不写字段默认插入所有字段,有几个字段就要插入几个值
insert into users (user_name) values (‘xiaoming’);


delete from users;删除表所有数据
delete from users where user_name=’xiaoming’;指定删除的位置


update users set user_passwd=’888888’ where user_name=’xiaoming’;
只改user_name=’xiaoming’ 的 user_passwd 。不指定条件改全部


select * from users; *查看所有数据 需要先use 库
select * from yunjisuan.users; 查看数据 无需use
##权限设置
mysql是写在缓冲里的,是异步存入磁盘
mysql -uroot -p102846 -e‘select * from yunjisuan.user’ 查看磁盘内容
flush privileges 刷新立刻同步到磁盘,立即生效
###修改密码的方法
update mysql.user set password=passwprd(‘666666’) where host=’localhost’;
修改权限后必须刷新同步

用户权限

  1. 修改用户权限(如果没有此账号,则创建用户)
    grant all on . to ‘root’@’192.168.200.161’ IDENTIFIED BY ‘123456’
    all 代表所有权限(select delete update insert) *.*所有库所有表
    添加权限不用输入密码
    撤销权限
    revoke select on . from ‘yunjisuan’@’192.168.200.135’
    添加权限会叠加

  2. 客户端下载mysql-client
    yum -y install mysql

  3. 远程登录mysql
    mysql -uyunjisuan -p123123 -h 192.168.200.129

    查看账号和IP select user,host from mysql.user;
    查看登录的账号 select user();
    查看当前登录用户权限 show grants;
    查看其它用户权限 show grants for ‘用户名’@’IP地址’
    撤销权限
    revoke select on . from ‘yunjisuan’@’192.168.200.135’
    _:任意单个字符
    %:任意多个字符

MySQL日志管理

MySQL日志包括:
错误日志 /use/local/mysql/data/主机名.err
通用查询日志 一般不开
二进制日志
慢速查询日志
记录所有执行时间超过最长时间的SQL语句,可用于找到执行时间长的查询,以用于优化。默认未开启。
开启方法
vim /etc/my.cnf
[mysqld]
long_query_time=5
log-slow-queries=mysql_slow.log
##索引
索引的分类
普通索引:这是最基本的索引类型,而且没有唯一性之类的限制
唯一性索引:与普通索引基本相同,区别在于:索引列的所有值都只能出现一次,即必须唯一,但可为空。
主键:是一种特殊的唯一索引,必须制定为“PRIMARY KEY”,具有唯一性的同时不能为空。
全文索引:
单列索引与多列索引:索引可以是单列上创建的索引,也可以是多列上创建的索引。

事物

事物具有四个性质:ACID
原子性、一致性、隔离性、持久性
begin 开始一个事物
commit提交一个事物
rollback回滚一个事物
show variables like ‘%autocommit%’; 查看系统全局变量,查看自动提交是否开启
set autocommit=0 // 禁止自动提交
set autocommit=1 //开启自动提交
上面是临时修改,永久修改要在配置文件中添加

数据库备份

分类
完全备份:每次对数据进行完整的备份
优点:备份与恢复操作简单方便
缺点:数据存在大量的重复;占用大量空间;备份与恢复时间长
增量备份:只有那些在上次完全备份或者增量备份后被修改的文件才会
小企业每天一次全备份
大企业每周一次全备 每天都在增备

完全备份

全备命令 mysqldump 热备份
但是这个命令锁表,使用时用户不能写数据
也可以打包data目录,但是只能在mysql未使用状态才可以 冷备份

  1. 创建备份目录
    mkdir backup
  2. mysqldump -uroot -p102846 yunjisuan > /backup/yunjisuan-$(date +%F).sql
    备份yunjisuan库里的表,对单个库备份

mysqldump -uroot -p102846 --databases mysql auth > /backup/mysql+auth-$(date +%F).sql
备份多个库 --databases 备份库

mysqldump -uroot -p102846 --opt --all-databases >/backup/mysql_all.$(date +%F).sql
备份所有库 --opt加快备份速度,当备份数据量大时使用

mysqldump -uroot -p102846 auth user >/backup/auth_user-$(date +%F).sql
备份auth库中的user表

mysqldump -uroot -p102846 -d mysql user >/backup/desc_mysql_user-$(date +%F).sql
备份mysql.user的结构

恢复备份

在mysql里 交互方式
soutce /backup/mysql_all.20160505.sql;
非交互方式
mysql -uroot -p102846 < 备份路径

增量备份

mysqlbinlog二进制日志
my.cnf
第52行 max_binlog_size=1024000 // 二进制日志最大1M 工作中一般设3M
49 log-bin=mysql-bin 开启二进制日志
命令mysqlbinlog end_log_pos 287 位置
flush logs; 刷新二进制日志
mysqlbinlog --stop-datetime=’年-月-日 小时:分钟:秒’ 二进制日志 | myself -uroot -p102846
从日志开头截止到某个时间点恢复
mysqlbinlog --start-datetime=年-月-日 小时:分钟:秒’ 二进制日志 | myself -uroot -p102846
从某个时间点到日志结尾恢复
mysqlbinlog --start-datetime=年-月-日 小时:分钟:秒’ --stop-datetime=’年-月-日 小时:分钟:秒’ 二进制日志 | myself -uroot -p102846
从某个时间点到某个时间点恢复
mysqlbinlog --stop-position=’操作 id’ 二进制日志 | mysql -uroot -p102846
mysqlbinlog --start-position=’操作 id’ 二进制日志 | mysql -uroot -p102846
基于位置进行恢复
show master status; 查看位置
binlog日志中 end_log_pos 位置

mysqlbinlog 增量备份文件 | mysql -uroot -p102846
备份的二进制日志内容全部恢复

在企业中如何去应用MySQL的备份策略

  1. 中小公司,由于数据量小,数据安全不是特别重要,允许小数量的细节数据丢失。因此,每天进行一次数据库的全量备份即可。定时任务+全备脚本
  2. 中大型公司,由于数据量大,每天全备时间太长,而且,比较关注数据安全和完整,无法承受数据丢失,哪怕只是少量的。对于这种类型的公司,我们通常采取全量备份+增量备份的方式来进行,也就是每周进行一次全量备份===>定时任务+全备脚本;每天进行一次增量备份,binlog二进制日志的方式。

中小企业场景,数据库的全量备份如何实现?

  1. 推送
    采用rsync备份服务器的话;
    数据库的定时任务备份结束以后,自动rsync推送到备份服务器。
  2. raid阵列
    在MySQL服务器上,额外进行raid磁盘阵列的挂载在/backup,全备脚本将备份到此目录中。

中大型或大型企业,MySQL备份策略如何实现

  1. 全备+增备
  2. 每周一次全备
  3. 增备的实现两种方式
    第一种:通过定时任务+增备切割推送脚本
    每天0点,flush logs;
    第二种,不推,实时同步rsync+inotify
    每周的全量备份结束以后,进行一次flush logs

MySQL存储引擎

MySQL常用的两种存储引擎:MyISAM、InnoDB

MyISAM特点

  1. 不支持事务(功能单一)
  2. 数据在更新时锁定整个表(对写的支持不好)
  3. 数据库在读写过程中互相阻塞
  4. 可以通过key_buffer_size来设置缓存索引(只缓存索引,不缓存数据)
  5. 速度过程较快而且占用资源相对较少。
    一般用于:服务器硬件资源相对比较差
    数据修改相对较少的业务
    使用读写并发访问相对较低的业务
    公司业务不需要事务支持
    对数据业务一致性要求不是非常高

InnoDB的特点

  1. 支持事务:支持4个事务隔离级别
  2. 支持锁定,但是全表扫描仍然会是表级锁定
  3. 读写阻塞与事务隔离级别相关
  4. 具有非常高效的缓存特性:能缓存索引,也能缓存数据
  5. 对硬件资源要求比较高
  6. 表与主键以簇的方式储存

MySQL的多实例应用

简单地说,MySQL多实例就是在一台服务器上同时开启多个不同的服务器端口,同时运行多个MySQL服务进程,这些服务进程通过不同的socket监听不同的服务器端口来提供服务。

MySQL多实例的作用

  1. 有效利用服务器资源
  2. 节约服务器资源

配置步骤

  1. 安装依赖包 ncurses-devel libaio-devel
    yum -y install ncurses-devel libaio-devel
  2. 编译安装cmkae(详细步骤在上面)
    tar xf cmake-2.8.6.tar.gz -C /usr/src/
    cd /usr/src/cmake-2.8.6
    ./configure && gmake && gmake install
  3. 解包MySQL
  4. 创建mysql程序用户
    useradd -M -s /sbin/nologin mysql
  5. 解包MySQL
    tar xf mysql-5.5.22.tar.gz -C /usr/src/
    cd /usr/local/mysql-5.5.22/
  6. 采用编译的方式安装MySQL
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.5.22 \
> -DMYSQL_DATADIR=/usr/local/mysql-5.5.22/data \ #数据存放目录
> -DMYSQL_UNIX_ADDR=/usr/local/mysql-5.5.22/tmp/mysql.sock \ #MySQL进程间通信的套接字位置
> -DDEFAULT_CHARSET=utf8 \ #默认字符集为utf8
> -DDEFAULT_COLLATION=utf8_general_ci \ #默认字符集排序规则
> -DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii \ #额外的字符集支持
> -DENABLED_LOCAL_INFILE=ON \ #是否启用加载本地数据
> -DWITH_INNOBASE_STORAGE_ENGINE=1 \ #静态编译innodb存储引擎到数据库
> -DWITH_FEDERATED_STORAGE_ENGINE=1 \ #静态编译FEDERATED存储引擎到数据库
> -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ #静态编译blackhole存储引擎到数据库
> -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \ #不编译EXAMPLE存储引擎到数据库
> -DWITHOUT_PARTITION_STORAGE_ENGINE=1 \ #不支持数据库分区
> -DWITH_FAST_MUTEXES=1 \
> -DWITH_ZLIB=bundled \ #zlib压缩模式
> -DENABLED_LOCAL_INFILE=1 \ #是否启用本地的LOCAL_INFILE
> -DWITH_READLINE=1 \ #使用捆绑的readline
> -DWITH_EMBEDDED_SERVER=1 \ #是否要建立嵌入式服务器
> -DWITH_DEBUG=0 #禁用DEBUG(开启影响性能)
# 提示:编译时可配置的选项很多,具体可参考官方文档
make && make install
  1. 设置软链接
    ln -s /usr/local/mysql-5.5.22 /usr/local/mysql
    ln -s /usr/local/mysql/bin/* /usr/local/bin/

  2. 创建MySQL数据目录
    mkdir /data/{3306,3307}/data
    tree /data tree需要安装

  3. 配置文件

##实例3306配置文件my.cnf
[root@localhost ~]# cat /data/3306/my.cnf
[client]
port = 3306
socket = /data/3306/mysql.sock
[mysqld]
user = mysql
port = 3306
socket = /data/3306/mysql.sock
basedir = /usr/local/mysql
datadir = /data/3306/data
open_files_limit = 1024
back_log = 600
max_connections = 800
max_connect_errors = 3000
table_open_cache = 614
external-locking = FALSE
max_allowed_packet = 8M
#binlog_cache_size = 1M
#max_heap_table_size = 64M
#read_buffer_size = 2M
#read_rnd_buffer_size = 16M
sort_buffer_size = 1M
join_buffer_size = 1M
thread_cache_size = 100
thread_concurrency = 2
query_cache_size = 2M
query_cache_limit = 1M
query_cache_min_res_unit = 2k
#ft_min_word_len = 4
#default-storage-engine = MYISAM
thread_stack = 192K
transaction_isolation = READ-COMMITTED
tmp_table_size = 2M
max_heap_table_size = 2M
#log-bin=mysql-bin
#binlog_format=mixed
#slow_query_log
long_query_time = 1
pid-file = /data/3306/mysql.pid
relay-log = /data/3306/relay-bin
relay-log-info-file = /data/3306/relay-log.info
binlog_cache_size = 1M
max_binlog_cache_size = 1M
max_binlog_size = 2M
key_buffer_size = 16M
read_buffer_size = 1M
read_rnd_buffer_size = 1M
bulk_insert_buffer_size = 1M
lower_case_table_names = 1
skip-name-resolve
slave-skip-errors = 1032,1062
replicate-ignore-db = mysql

server-id = 1

#key_buffer_size = 32M
#bulk_insert_buffer_size = 64M
#myisam_sort_buffer_size = 128M
#myisam_max_sort_file_size = 10G
#myisam_repair_threads = 1
#myisam_recover
innodb_additional_mem_pool_size = 4M
innodb_buffer_pool_size = 32M
innodb_data_file_path = ibdata1:128M:autoextend
innodb_file_io_threads = 4
#innodb_write_io_threads = 8
#innodb_read_io_threads = 8
innodb_thread_concurrency = 8
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 4M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
innodb_file_per_table = 0

[mysqldump]
quick
max_allowed_packet = 2M

[mysql]
no-auto-rehash

#[myisamchk]
#key_buffer_size = 512M
#sort_buffer_size = 512M
#read_buffer = 8M
#write_buffer = 8M
#[mysqlhotcopy]
#interactive-timeout

[mysqld_safe]
log-error = /data/3306/mysql_yunjisuan3306.err
pid-file = /data/3306/mysqld.pid
  1. 配置启动脚本 /data/3306/mysql
[root@localhost ~]# cat /data/3306/mysql
#!/bin/bash
###############################################
#this scripts is created by Mr.chen at 2016-06-25

port=3306
mysql_user="root"
mysql_pwd="" #这里需要修改为用户的实际密码

CmdPath="/usr/local/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"

#startup function
function_start_mysql(){

if [ ! -e "$mysql_sock" ];then
printf "Starting MySQL....\n"
/bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 >/dev/null &
else
printf "MySQL is running...\n"
exit
fi
}

#stop function
function_stop_mysql(){

if [ ! -e "$mysql_sock" ];then
printf "MySQL is stopped...\n"
exit
else
printf "Stoping MySQL...\n"
${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown
fi
}

#restart function
function_restart_mysql(){

printf "Restarting MySQL...\n"
function_stop_mysql
sleep 2
function_start_mysql
}

case $1 in 
start)
function_start_mysql
;;
stop)
function_stop_mysql
;;
restart)
function_restart_mysql
;;
*)
printf "Usage: /data/${port}/mysql{start|stop|restart}\n"
esac
  1. 将启动脚本权限改成700 将/data属主属组改为mysql
    find /data -name “mysql” | xargs chmod 700
    chown -R mysql.mysql

  2. 软链接mysql
    ln -s /usr/local/mysql/bin/* /usr/local/sbin/

  3. 初始化MySQL
    chmod +x /usr/local/mysql/scripts/mysql_install_db
    cd /usr/local/mysql/scripts
    [root@localhost scripts]# ./mysql_install_db --basedir=/usr/local/mysql --datadir=/data/3306/data --user=mysql
    [root@localhost scripts]# ./mysql_install_db --basedir=/usr/local/mysql --datadir=/data/3307/data --user=mysql

  4. 启动MySQL
    /data/3306/mysql start
    /data/3307/mysql start

  5. 启动MySQL
    mysql -uroot -p102846 -S /data/3306/mysql.sock
    S 指定示例位置
    P 指定监听端口

  6. 添加密码
    mysqladmin -u root -S /data/3306/mysql.sock password ‘102846’

MySQL主从复制架构(AB复制)

主服务器(Master)
从服务器(Slave)
模式: 1.单向主从同步模式
2.一主多从模式
3.双主双向同步(互为主从模式)
4.单向线性级联同步
5.单向环状级联同步
应用场景:

  1. 从服务器作为主服务器的实时数据备份
  2. 主从服务器实现读写分离,从服务器实现负载均衡
  3. 把多个从服务器根据业务重要性进行拆分访问
    主库需要: 1. 打开binlog日志 log-bin=mysql-bin
    2.创建主从复制账号
    3.server id = 1
    从库需要:1.打开中继日志 relay-log=relay-bin
    中继日志relay-log
    2.主从复制验证信息录入
    3.激活主从复制
    4.server id = 5 只要不和主库一样就可以

主从复制原理

第一步:从IO线程主动找主IO线程复制binlog日志(这时需要验证)
验证信息都会是什么?

  1. 主库IP
  2. 主库的复制账号和密码
  3. 复制哪个二进制文件的名字
  4. 二进制文件中position具体位置
  5. 主库socket进程的端口
    master.info记录验证信息和二进制文件位置信息
    第二步:主IO线程把二进制文件对应位置的binlog文件复制出来
    第三步:主IO线程把binlog内容和新的binlog文件和位置信息给从IO线程
    第四步:从IO线程将新的位置信息记录到master.info
    第五步:从IO线程就会把复制的内容放到中继日志中relay-bin
    从SQL线程记录之前写到哪个中继日志中以及哪个中继日志的位置信息记录到relay-log.info中
    第六步:从SQL线程开始往数据库中写数据

###实践步骤
1.修改主库的配置文件
vim /data/3306/my.cnf
[mysql]
server-id = 1
log-bin = /data/3306/mysql-bin
2. 修改从库的配置文件
vim /data/3307/my.cnf
relay-log = /data/3307/relay-bin
3. 修改后重启mysql服务
4. 在主库中创建主从复制账号
grant replication slave on . to ‘yunjisuan’@’192.168.200.%’ identified by ‘123123’;
flush prvileges;
5. 主从复制需要两个库内容一样,需要将主库全备,然后导入到从库
mysqldump -uroot -p102846 --all-databases -S /data/3306/mysql.sock> /tmp/mysql_all ( d a t e + 3307 交 互 状 态 s o u r c e / t m p / m y s q l a l l (date +%F).sql 3307交互状态 source /tmp/mysql_all (date+3307source/tmp/mysqlall(date +%F).sql
6. 主库查看位置和binlog文件
show master status;
7. 配置参数
CHANGE MASTER TO
MASTER_HOST=‘192.168.0.200’, #这里是主库的IP
MASTER_PORT=3306, #这里是主库的端口,从库端口可以和主库不同
MASTER_USER=‘yunjisuan’, #这里是主库上建立的用于复制的用户yunjisuan
MASTER_PASSWORD=‘yunjisuan123’, #这里是yunjisuan用户的密码
MASTER_LOG_FILE=‘mysql-bin.000001’, #这里是show master status时查看到的二进制日志文件名称,注意不能多空格
MASTER_LOG_POS=533; #这里是show master status时查看到的二进制日志偏移量,注意不能多空格
#提示:字符串用单引号括起来,数值不用引号,注意内容前后不能有空格
CHANGE MASTER TO MASTER_HOST=‘192.168.200.137’,MASTER_PORT=3307,MASTER_USER=‘yunjisuan’,MASTER_PASSWORD=‘102846’,MASTER_LOG_FILE=‘mysql-bin.000001’,MASTER_LOG_POS=341;

8.查看主从复制状态
show slave status\G
Slave_IO_Running: yes
Slave_SQL_Running: yes
Seconds_Behind_Master: 0 #0表示已经同步

###MySQL主从复制延迟问题的原因及解决方案
问题一:主库的从库太多,导致复制延迟
从库数量以3~5个为宜,要复制的从节点数量过多,会导致复制延迟
问题二:从库硬件比主库差,导致复制延迟。
查看Master和Slave的系统配置,可能会因为机器配置不当,包括磁盘I/O,CPU,内存等各方面因素造成复制的延迟。这一般发生在高并发大数据量写入场景中。
问题三:慢SQL语句太多
假如一条SQL语句执行时间是20秒,那么从执行完毕到从库上能查到数据至少需要20秒,这样就延迟20秒了。
一般要把SQL语句的优化作为常规工作,不断的进行监控和优化,如果单个SQL的写入时间长,可以修改后分多次写入。通过查看慢查询日志或show full processlist命令,找出执行时间长的查询语句或大的事务。
问题四:主从复制的设计问题
例如,主从复制单线程,如果主库写并发太大,来不及传送到从库,就会导致延迟。
问题五:主从库之间的网络延迟
主从库的网卡,网线,连接的交换机等网络设备都可能成为复制的瓶颈,导致复制延迟,另外,跨公网主从复制很容易导致主从复制延迟。
问题六:主库读写压力大,导致复制延迟
主库硬件要搞好一点,架构的前端要加buffer及缓存层。

更高版本的MySQL可以支持多线程复制,门户网站则会自己开发多线程同步功能。

出现问题解决方法 SQL no的时候可以临时跳过错误
stop slave;
set global sql_slave_skip_counter=1;
start slave;
数据会不同 但是可以正常主从复制 到时候可以在用户少的时候 锁库 全备主库 恢复到从库

实现对主数据库锁表只读
flush table with read lock;
解锁
unlock tables;

reset slave all; 清除主从复制
show slave status\g 查看主从复制信息
从库禁止写数据,从库权限设置只能读

主从复制代替不了数据同步
数据备份在从库 因为mysqldump备份时会锁库
如果主库和从库的账号系统不一致 不能备份账号系统
也可以在配置文件中设置从库只读,好处备份方便,不用考虑账号不同
【mysqld】
read-only #挡不住超级用户和replication slave(主从复制账号)
mysqldump不能在主库用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值