单多实例,主从复制,备份恢复

关系型数据库(二维表格)
  • oracle
  • mysql
  • mariaDb(mysql数据库的分支)
 
非关系型数据库(nosql)
  • 键值存储数据库
    • 优势:简单,易部署,高并发,高性能,易拓展
    • 例子: memcached redis memcacheDb berkeleyDb
  • 列存储数据库
    • 优势:应对分布式存储的海量数据
    • 例子:Cassandra HBase (月薪没有15000没有使用的意义,只有大企业用)
  • 面向文档数据库
    • 特点:用文档的形式存储,格式有json和xml等
    • 例子:MongoDb CouchDb
  • 图形数据库
    • 例子:Neo4J InfoGrid
 
 
服务器数据库单多实例
  • 单实例安装启动
    • 添加用户组
      • 添加权限组
      • groupadd mysql
      • 添加用户到组
      • useradd -s /sbin/nologin -g mysql -M mysql
    • 安装cmake环境
    • 编译安装mysql
      • 下载资源
      • wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.36.tar.gz
      • tar xzvf mysql-5.5.36.tar.gz
      • 进入目录
      • cd mysql-5.5.36
      • 编译安装
      • cmake -DCMAKE_INSTALL_PREFIX=/application/mysql-5.5 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_ZLIB=system -DWITH_EMBEDDED_SERVER=1 -DENABLED_LOCAL_INFILE=1 -DMYSQL_DATADIR=/application/mysql-5.5/data -DEXTRA_CHARSETS=gbk,gb2312,utf8,utf8mb4,ascii
      • make && make install
      • 建立软连接
      • ln -s /application/mysql-5.5 /application/mysql
    • 配置环境变量
      • echo ‘export PATH=/application/mysql/bin:$PATH’ >> /etc/profile
      • tail -1 /etc/profile
      • source /etc/profile
      • echo $PATH
    • 单实例配置
      • 权限和配置
        • cd /application/mysql
        • 复制配置文件到etc
        • cp support-files/my-medium.cnf /etc/my.cnf
        • 设置用户目录访问权限
        • chown -R mysql.mysql /application/mysql/
        • 开放tmp目录权限 
        • chmod -R 1777 /tmp/
        • cd /application/mysql/scripts 
        • 数据库初始化
        • ./mysql_install_db —basedir=/application/mysql/ —datadir=/application/mysql/data/ —user=mysql
        • cd /application/mysql 
        • 复制mysql开启shell到etc 并设置可执行权限
        • cp support-files/mysql.server /etc/init.d/mysqld
        • chmod +x /etc/init.d/mysqld
      • 启动
        • /etc/init.d/mysqld start (注意:启动失败错误日志在application/mysql/data 目录下的以主机命名后缀为err文件)
        • netstat -lntup|grep 3306
      • 关闭
        • /etc/init.d/mysqld stop
      • 状态
        • /etc/init.d/mysqld restart
    • 多实例配置
      • 单实例转过来的话
        • 先停掉mysql服务
        • /etc/init.d/mysqld stop
        • 删掉原来的启动方式 多实例之后不用这种方式启动
        • rm -f /etc/init.d/mysqld 
      • 安装tree方便查看配置文件目录
      • yum install tree
      • tree /data
      • !!!创建多实例配置目录 一个端口号一个实例 端口号下面data文件夹 一个my.cnf配置文件 一个mysql启动文件
      • 创建data文件夹
      • mkdir /data/{3306,3307}/data
      • 制作my.cnf(复制mysql安装目录下下support_files里面的配置文件改)
      # Example MySQL config file for small systems.
      #
      # This is for a system with little memory (<= 64M) where MySQL is only used
      # from time to time and it's important that the mysqld daemon
      # doesn't use much resources.
      #
      # MySQL programs look for option files in a set of
      # locations which depend on the deployment platform.
      # You can copy this option file to one of those
      # locations. For information about these locations, see:
      #
      # In this file, you can use all long options that a program supports.
      # If you want to know which options a program supports, run the program
      # with the "--help" option.
      # The following options will be passed to all MySQL clients
      [client]
      #password= your_password
      port= 3306
      socket= /data/3306/mysql.sock
      # Here follows entries for some specific programs
      # The MySQL server
      [mysqld]
      user= mysql
      port= 3306
      socket= /data/3306/mysql.sock
      basedir= /application/mysql
      datadir= /data/3306/data
      open_files_limit = 1024
      skip-external-locking
      key_buffer_size = 16K
      max_allowed_packet = 1M
      table_open_cache = 4
      sort_buffer_size = 64K
      read_buffer_size = 256K
      read_rnd_buffer_size = 256K
      net_buffer_length = 2K
      thread_stack = 128K
      log-error= /data/3306/error.log
      log-slow-queries = /data/3306/slow.log
      pid-file=/data/3306/mysql.pid
      relay-log-info-file = /data/3306/relay-log.info
      binlog_cache_size = 1M
      max_binlog_cache_size = 1M
      # Don't listen on a TCP/IP port at all. This can be a security enhancement,
      # if all processes that need to connect to mysqld run on the same host.
      # All interaction with mysqld must be made via Unix sockets or named pipes.
      # Note that using this option without enabling named pipes on Windows
      # (using the "enable-named-pipe" option) will render mysqld useless!
      #
      #skip-networking
      server-id= 1
      # Uncomment the following if you want to log updates
      #log-bin=/data/3306/mysql-bin
      # binary logging format - mixed recommended
      #binlog_format=mixed
      # Causes updates to non-transactional engines using statement format to be
      # written directly to binary log. Before using this option make sure that
      # there are no dependencies between transactional and non-transactional
      # tables such as in the statement INSERT INTO t_myisam SELECT * FROM
      # t_innodb; otherwise, slaves may diverge from the master.
      #binlog_direct_non_transactional_updates=TRUE
      # Uncomment the following if you are using InnoDB tables
      #innodb_data_home_dir = /application/mysql-5.5/data
      #innodb_data_file_path = ibdata1:10M:autoextend
      #innodb_log_group_home_dir = /application/mysql-5.5/data
      # You can set .._buffer_pool_size up to 50 - 80 %
      # of RAM but beware of setting memory usage too high
      #innodb_buffer_pool_size = 16M
      #innodb_additional_mem_pool_size = 2M
      # Set .._log_file_size to 25 % of buffer pool size
      #innodb_log_file_size = 5M
      #innodb_log_buffer_size = 8M
      #innodb_flush_log_at_trx_commit = 1
      #innodb_lock_wait_timeout = 50
      [mysqldump]
      quick
      max_allowed_packet = 16M
      [mysql]
      no-auto-rehash
      # Remove the next comment character if you are not familiar with SQL
      #safe-updates
      [myisamchk]
      key_buffer_size = 8M
      sort_buffer_size = 8M
      [mysqlhotcopy]
      interactive-timeout
      [mysqld_safe]
      log-error = /data/3306/mysql_gg3306.err
      pid-fiel=/data/3306/mysqld_gg3306.pid
      • 制作mysql启动文件(shell编程)
      #!/bin/sh
      #init
      port=3306
      mysql_user="root"
      mysql_pwd=""
      CmdPath="/applicaton/mysql/bin"
      mysql_sock="/data/${port}/mysql.sock"
      #startup function
      function_start_mysql()
      {
      if [ ! -e "$mysql_sock” ];then
      printf "starting mysql... "
      /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &
      else
      printf "mysql is running... "
      exit
      fi
      }
      #stop function
      function_stop_mysql()
      {
      if [ ! -e "$mysql_sock” ];then
      printf "mysql is stopped... "
      exit
      else
      printf "stoping mysql... "
      ${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown
      fi
      }
      #restart function
      function_restart_mysql()
      {
      printf "restarting mysql... "
      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} "
      esac
      • 授权用户管理mysql文件目录
      • chown -R mysql.mysql /data
      • 设置mysql可执行权限
      • 查询不同目录下的权限
      • find /data/ -type f -name mysql|xargs ls -l
      • 设置不同目录下的权限
      • find /data/ -type f -name mysql|xargs chmod +x
      • 初始化数据库多实例数据库文件
      • cd /application/mysql/scripts/
      • ./mysql_install_db --basedir=/application/mysql --datadir=/data/3306/data --user=mysql
      • ./mysql_install_db --basedir=/application/mysql --datadir=/data/3307/data --user=mysql
      • 启动mysql
      • /data/3306/mysql start
      • /data/3307/mysql start
      • 查询开启端口
      • netstat -lntup|grep 330[6-7] 
      • 登陆mysql
      • mysql -S /data/3306/mysql.sock
      • 更改mysql用户密码(三种方法)
      • mysqladmin -u root -S /data/3306/mysql.sock password 'root'
      • update mysql.user set password = password(‘root') where user = 'root';
      • set password = password(‘root’);
      • flush privileges;
      • 修改mysql权限
      • find /data -type f -name mysql -exec chmod 700 {} ;
      • find /data -type f -name mysql -exec chown root.root {} ;
      • find /data -type f -name mysql -exec ls -l {} ;
      • 带密码登陆
      • mysql -u root -proot -S /data/3306/mysql.sock
      • 远程登录
      • Mysql -uroot -p’root' -h 127.0.0.1 -P 3306
      • 关闭所有mysqld
      • pkill mysqld
      • 如果服务起不来 删除对应的sock和pid后再启动
      • rm -f /data/3306/mysql.sock /data/3306/*.pid
      • 增加新的mysql用户
      • create user newuser@localhost identified by ’newpassword’;
    • 多实例增加一个新实例
      • 增加一个新的配置文件目录
        • mkdir /data/3308/data -p
      • 复制启动文件
        • cp /data/3306/mysql /data/3308
      • 修改启动文件
        • vi /data/3308/mysql
        • : %s/3306/3308/g;
      • 复制配置文件
        • cp /data/3306/my.cnf /data/3308
      • 修改配置文件
        • vi /data/3308/my.cnf
        • : %s/3306/3308/g;
        • 修改server-id 保持和其他的实例不一样
      • 修改目录权限
        • chown -R mysql.mysql /data/3308
      • 初始化mysql
        •  ./mysql_install_db --basedir=/application/mysql --datadir=/data/3308/data --user=mysql
      • 登陆进mysql修改用户密码 默认为空
        • update mysql.user set password = password(‘root') where user = 'root';
 
 
Mysql解决中文乱码问题
*保持系统,客户端,服务端,库,表,程序的编码一致
*查询mysql当前编码信息 show variables like ‘%character%'
*请保证插入数据之前 客户端 连接 返回结果的字符集和数据库表的字符集保持一致
*对于已经存在的数据库和表修改字符编码,之前的数据保持之前的编码,新的数据采用新的编码,要对所有的数据和表生效,要导出数据并修改再导入。
  1. mysql中 set names 编码(与库的编码方式保持一致,每次进入都要设置,退出失效)
  2. mysql文件中set names 编码,然后mysql中source mysql文件
  3. mysql文件中set names 编码,然后mysql命令 mysql -u root -proot 数据库名 < mysql文件
  4. mysql命令 mysql -u root -proot —-default-character-set=编码 数据库名 < mysql文件
  5. 更改配置文件my.cnf client模块下面default-character-set=编码(不同的mysql版本设置参数可能不一样)
 
 
线上修改mysql字符编码实战步骤(改utf8为gbk)
  1. 导出表结构(这里的默认字符编码是导出库原本的字符编码)
    1. mysqldump -uroot -p —-default-character-set=utf8-d dbname> alltable.sql 
  2. 编辑alltable.sql 将utf8改为gbk
  3. 确保数据库不再更新,导出所有的数据(这里的默认字符编码是导出库原本的字符编码)
    1. mysqldump -uroot -p -—quick -—no-create-info -—extended-insert -—default-character-set=utf8 dbname> all data.sql 
    2. —no-create-info表示不建表
  4. 编辑alldata.sql 将set names utf8 改为 set names gbk;
  5. 创建新的编码数据库
    1. create database dbname default charset gbk;
  6. 创建表,执行alltable.sql
    1. mysql -uroot -p dbname < alltable.sql
  7. 导入数据,执行alldata.sql
    1. mysql -uroot -p dbname < alldata.sql
 
 
mysql的备份和恢复(红色表示多实例参数)
linux下mysq命令可以加-e “select * from user”这样的命令来操作msql数据库,mysql内可以用system ls -al 这样的命令来操作linux
  1. 导出
    1. mysqldump -uroot -p-S /data/3306/mysql.sock dbname > db.sql
    2. 压缩 mysqldump -uroot -p-S /data/3306/mysql.sock dbname | gzip > db.sql.gz
    3. 参数明细 (可以用mysqldump —help > a.log 查看所有的参数)
      1.  —default-character-set=utf8 设置默认字符集
      2. -B 设置了该参数 会在sql文件前面生成创建数据库语句 并且use 数据库 后面可以跟多个数据库名称导出多个数据库在同一个sql文件 没有-B的情况下只能跟一个数据库名称 后面再跟零或多个数据库表备份全部或多个数据库表数据
      3. --extended-insert 合并多条insert语句 减少io
      4. —quick
      5. —compact 一般用于debug 减少一些sql语句输出
      6. -x 和 —lock-all-tables 备份的时候一般都要锁表
      7. —single-transaction 适合innodb事务数据库备份
      8. -d 只备份表结构 不备份表数据
      9. -t 和 --no-create-info 都是只备份表数据 不备份表结构
      10. -A 和 —all-databases 都是备份全部的数据库信息
      11. -F 备份并且切割刷新binlog
      12. —master-data=1 备份文件里面有binlog目前的位置信息 如果把该参数设置为2 则注释掉这个位置信息,恢复的时候不执行change binlog语句
    4. 多库导出
      1. 逐个语句导出,一个语句一个库
      2. 一个语句全部导出
        1. mysql -uroot -proot -S /data/3306/mysql.sock -e “show databases;" | grep -Evi “database|infor|perfor” | sed -r ’s#^([a-z].*$)#mysqldump -uroot -proot --events -B -S /data/3306/mysql.sock 1|gzip > /opt/sql/1.sql.gz#g’ | bash
  2. 导入
    1. linux下(解压用 gzip -d a.sql.gz)
      1. 没有建立数据库语句的sql文件
        1. mysql -root -p-S /data/3306/mysql.sock dbname < db.sql
      2. 有建立数据库语句的sql文件
        1. mysql -root -p-S /data/3306/mysql.sock < db_B.sql
    2. mysql下
      1. source /path/a.sql
  3. 生产备份(抽出来单独写)
    1. myisam
      1. mysqldump -uroot -proot -A -B -F -x —master-data=2 —events | gzip > a.sql
    2. innodb
      1. mysqldump -uroot -proot -A -B -F —single-transaction —master-data=2 —events | gzip > a.sql
 
mysql一些操作
  • 显示所有的进程(可以看到执行语句,可配合explain用于sql语句调优)
    • show full processlist(如果过多sleep进程怎么处理?)
  • 查看log_bin二进制数据有没有打开
    • mysql -uroot -proot -e "show variables;" | grep log_bin
    • show variables like “%log_bin%"
    • grep log-bin /etc/my.cnf
  • 查看当前mysql连接的状态
    • show status
    • show global status like “insert” //可以查询一共insert了多少次 
  • 修改参数不重启生效
    • show variables like “key_buffer_size%”;
    • set global key_buffer_size = 1024*1024*32;
    • 这样设置是全局的 只要不重启mysqld 就会一直生效
    • 一般线上这样更改全局变量 要连同my.cnf文件一起修改,无论重不重启都生效
 
mysqlbinlog
  • 是啥?
    • 在mysql/data目录下的mysql-bin.000001,mysql-bin.000002等等文件 就是mysql的binlog日志,mysql-bin.index记录了所有的mysq binlog日志索引
  • 干啥?
    • 用来储存所有对mysql数据有更新的操作记录
  • 打开
    • 取消mysql配置文件my.cnf中的log-bin的#注释即可
    • grep log-bin my.cnf 
  • 查看日志
    • 正常cat会乱码。要用‘mysqlbinlog mysql-bin.000001‘ 方式查看
  • 导出binlog到sql文件
    • 导出全部库的
      • mysqlbinlog mysql-bin.000001 >  a.sql
    • 导出单库的
      • mysqlbinlog -d dbname mysql-bin.000001 >  a.sql
    • 指定binlog恢复位置
      • mysqlbinlog -d dbname mysql-bin.000001 —start-position=1 —stop-position= 5 >  a.sql
    • 指定binlog恢复时间
      • mysqlbinlog -d dbname mysql-bin.000001 —start-datetime=‘2019-05-23 00:00:01' —stop-datetime= ‘2019-05-24 00:00:01'  >  a.sql
 
主从复制
  • 普通文件的同步方案有哪些(rsync sersync,inotify,scp,nfs,samba,svn)
    • NFS网络文件共享可以同步存储数据
    • samba共享数据
    • 定时任务或者守护进程结合rsync,scp
    • inotify+rsync 触发式实现数据同步
    • ftp数据同步
    • ssh key + scp/rsync
    • svn版本管理
    • rsync,sersync,inotify,union(双向同步),csync2(多向同步)
  • mysql主从复制
    • 一些概念
      • mysql支持单向,双向,链式级联,实时,异步复制,复制过程中,一台服务器充当主服务器master,而一个或者多个其他的服务器充当从服务器slave,复制可以是单向的M=>S,也可以是双向的M<=>M,也可以是多M环状同步等等。如果设置了链式级联复制,那么从服务器本身除了充当从服务器外,也会同时充当其下面从服务器的主服务器,类似A=>B=>C=>D的复制形式。
      • 大多数应用的mysql主从复制都是异步的复制模式
      • 所有对数据库的数据更新都要在主数据库上进行以避免主从数据库的数据冲突,为了防止从数据库的数据更新,可以有两种方法实现:
      • 设置从库用户只拥有select权限
      • 从库服务器带参启动或者my.cnf设置read-only,保证从库只读
    • 应用场景
      • 主从服务器互为备份
      • 主从服务器读写分离分担网站压力
      • 根据数据库拆分业务独立并分担压力
        • 一主多从 根据业务需求拆分从库,例如
          • 多台从库用于前台业务查询
          • 单独从库用于主库备份
          • 单独从库用于后台业务查询 脚本运行 统计等等
    • 怎么同步不丢失数据?
      • 可以连接主库的话 可以拉主库的binlog数据来补全
      • 双写 程序上写两份
      • 程序上写一分钟的log 保存起来
      • 同步插件 把异步改成实时同步
    • 如何实现
      • 通过程序自身实现 读写分别用不同的数据库连接配置文件
      • 通过代理软件mysql-proxy,amoeba等
      • 门户网站 阿里分布式dbproxy(读写分离,hash负载均衡,健康检查)
    • 主从复制的原理
      • 主库有主要有io线程来处理数据
      • 从库主要有io线程 sql线程来处理数据
      • 因为开启了bin-log,用户做主库增删改,会在改变主库存储的同时,写入binlog
      • 主从复制是由从库找主库的,从库会change master to master_host=‘127.0.0.1’,master_user=‘root’,master_password=‘root’,master_port=‘3306’,master_log_file=‘mysql-bin.000001’,master_log_pos=‘1234’;start slave;然后从库io线程会对主库io线程发出连接请求,主库会验证从库连接的合法性。
      • 验证成功后,主库会根据从库发过来的binlog位置信息,给从库发送binlog日志
      •  从库io接受到binlog,会把binlog存储为relay-log中继日志,并跟新master info文件里面的最后位置信息,从库sql线程会自动侦测到relay-log的变化,并执行bin-log里面的执行语句并记录relay-info,以已经读取的位置。
      • 以此类推,不断请求推送执行,实现异步复制过程。
    • 实现
      • 如果要指定同步的库可以设置
        • 主库my.cnf
          • 二进制日志忽略的数据库 多个数据库用,分割
            • binlog-ignore-db = mysql
            • binlog-ignore-db = performance_schema
            • binlog-ignore-db = information_schema
          • 二进制日志记录的数据库 多个数据库用,分割
            • binlog-do-db = dbname
        • 从库my.cnf
          • 指定需要复制的数据库 多个数据库用,分割
            • replication-do-db
          • 指定忽略复制的数据库 多个数据库用,分割
            • replication-ignore-db
          • 指定需要复制的表 多个表用,分割
            • replication-do-table
          • 指定忽略复制的表 多个表用,分割
            • replication-ignore-table
          • 指定需要复制的表 多个表用,分割 可以加通配符
            • replication-wild-do-table
          • 指定忽略复制的表 多个表用,分割 可以加通配符
            • replication-wild-ignore-table
      • 可以多台服务器 也可以单服务器多实例,但是一般生产都是多服务器
      • 本实践用多实例进行,定义3306为主库 3307为从库 如果级联 3308为3307从库,(如果级联需要3307开启log-bin并且设置log-slave-updates,以下步骤标注了黄色背景的为不需要步骤)
        1. 打开主库bin-log
          1. vi /data/3306/my.cnf
          2. #log-bin 去掉前面的#
        2. 修改完成后 可以查看是否修改成功
          1. grep -E 'server-id|log-bin' /data/3306/my.cnf
          2. /data/3306/目录下 看有没有mysql-bin.index mysql-bin.000001等文件
          3. 进入mysql模式
            1. show variables like ‘log_bin’
            2. show variables like ’server_id’
        3. 关闭从库的bin-log
          1. vi /data/3307/my.cnf
          2. log-bin 前面加#
        4. 重启mysql生效
          1. /data/3306/mysql restart
          2. /data/3307/mysql restart
        5. 在主库建立用于从库同步的账号
          1. grant replication slave on *.* to ‘rep’@‘127.0.0.1’ identified by ‘rep123456’;
            1. replication slave是同步必须的权限 不要授权all
            2. *.* 表示所有的库所有的表 也可以指定库表 例如test.user
          2. flush privileges;
        6. 添加读锁 全库只能读
          1. flush table with read lock;
        7. 查看当前bin-log位置
          1. show master status
          2. show master logs
        8. 备份主库
          1. mysqldump -uroot -proot -S /data/3306/mysql.sock -A -B —master-data=1 -x —events > /opt/sql/master_all.sql
        9. 解锁
          1. unlock tables;
        10. 将备份好的主库文件导入从库
          1. mysql -uroot -proot -S /data/3307/mysql.sock < /opt/sql/master_all.sql
        11. 登陆进从库mysql修改主库连接信息
          1. mysql -uroot -proot -S /data/3307/mysql.sock
          2. 找到主库的正确信息修改信息(注意不能有多余空格)
          3. CHANGE MASTER TO MASTER_HOST='127.0.0.1',MASTER_PORT=3306,MASTER_USER='rep',MASTER_PASSWORD='rep123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=334;
        12. 开启主从复制
          1. start slave;
        13. 查看是否开启成功
          1. show slave statusG;
          2. Slave_IO_Running: Yes,Slave_SQL_Running: Yes 一般表示开启成功了
        14. 测试主库数据变更从库是否变更
        15. 主从库的线程状态可以通过show processlist;命令来查看。
    • 其他问题
      • 主从库都可以设置binlog的有效时间(天数)
        • expire_logs_days = 7 
        • 相当于执行了 find /data/3306/ -type f -name ‘mysql-bin.000*’ -mtime +7 | xargs rm -f
      • Mysql5.5以上版本支持半同步
        • 特点:半同步下的一主多从恢复,因为从库和主库完全一致,即主库和这个半同步从库都更新数据完毕才会返回给用户更新成功的信息,所以直接修改master.info设置半同步的从库为主库就行了。
        • 优点:确保至少有一个从库和主库的数据一致
        • 缺点:主从之间网络延迟或者从库有问题时用户体验很差,当然,可以设置超时间
      • 从库宕机
        • 重做slave
          • stop slave;
          • 灌数据
          • CHANG MASTER
          • start slave;
          • show slave status;
      • 一主多从 主库宕机 将从库切换主库继续同步全过程
        • 确认要提升为主库的从库
          • 确认从库同步的情况
            • show processlist;
          • 查看全部从库的master info文件 找出pos位置最大的从库作为切换主库
        • 确保所有的relay log全部更新完毕
          • 每个从库停止io线程 即停止请求binlog数据
            • stop slave io_thread
          • 查看sql线程状态 知道看到has read all relay log,表示全部的从库更新都执行完毕了
          • show processlist
        • 登陆这个提升从库 停止slave
          • mysql -uroot -proot -S /data/3307/mysql.sock
          • stop slave;
          • reset master;
          • quit;
        • 进入这个提升从库数据目录 删除master.info relay-log.info
          • Cd /data/3307/data
          • rm -f master.info relay-log.info
        • 检查授权表权限 rep同步账号存在
        • 提升该从库为主库
          • 开启bin-log
          • 删除log-slave-updates
          • 删除read-only
          • 重启该从库
        • 如果master服务器还能启动,拉取master服务器的binlog补全数据
        • 登陆其他从库 修改master info 如果同步失败 也可以指定同步位置
          • stop slave;
          • CHANGE MASTER TO MASTER_HOST=‘127.0.0.7’,MASTER_PORT=3307;
          • start slave;
          • show slave status;
        • 修改主程序连接数据库配置文件
        • 修理宕机服务器 作为从库使用
      • 双主或者多主互为主从同步全过程
        • 实现的前提
          • 表的主键自增(或者程序写库指定ID)
        • 一些参数说明
          • 解决主键自增冲突
            • master1(形成1,3,5,7。。。。序列)
              • auto_increment_increment = 2 #间隔
              • auto_increment_offset = 1 #id的初始位置
            • Master2 (形成2,4,6,8。。。。序列)
              • auto_increment_increment = 2 #间隔
              • auto_increment_offset = 2 #id的初始位置
          • 互为主从参数
            • log-slave-updates #开启从库的binlog日志
            • binlog-ignore-db = information_schema
            • binlog-ignore-db = mysql
            • skip-slave-start  #启动时忽略从库启动
            • replicate-same-server-id = 0
          • 其他参数
            • 唯一的server-id
            • 开启log-bin
        • 配置好以上的参数之后,分别做普通从库的实现就好了。例如,双主,先给master1配置master2从库,再给master2配置master1从库
      • 如何解决主从库冲突
        • 查看出现冲突的原因
          • show slave status
          • 可以看到当前的slave线程状态和出错代码、出错信息
        • 解决方法1
          • stop slave;
          • set global sql_slave_skip_counter = 1;(忽略这个冲突错误继续往下执行)
          • start slave;
          • 为保持主从数据的一致性,要找时间恢复下从库
        • 解决方法2
          • 从库my.cnf根据错误好跳过指定的错误
            • slave-skip-errors = 1032,1062,1007
            • slave-skip-errors=all
          • 一般因为入库重复的错误可以忽略 但是不推荐all忽略 这样可能导致数据不一致性
 
 
基于主从复制的读写分离
  • 如何确定只在主库更新
    • 从库连接用户授权限制
      • 授权方案1(mysql库同步的情况下)
        • 主库:web webpassword 127.0.0.1 3306 (select insert update delete)
        • 从库:同步主库账号后 回收insert update delete 权限
      • 授权方案2(mysql库不同步的情况下)
        • 主库:web webpassword 127.0.0.1 3306 (select insert update delete)
        • 从库:web webpassword 127.0.0.1 3307 (select)
    • 程序代码如果是写的操作则用主库连接文件
    • 让从库只能读不能写 在my.cnf设置read-only或者启动的时候指定--read-only
      • read-only属性对于主从复制的数据修改不生效
      • read-only属性对于拥有super或者all privileges权限的账号不生效
 
 
 
mysql备份
  • 备份的划分
    • 按天
      • 优点:恢复时间短 维护成本低
      • 缺点:占用空间多 占用系统资源多 经常锁表影响用户体验
    • 按周
      • 优点:占用空间少 占用的系统资源少 不经常锁表用户体验好一些
      • 缺点:维护成本高 恢复麻烦 时间长
原文地址:https://www.cnblogs.com/godehi/p/13091083.html