zoukankan      html  css  js  c++  java
  • MySQL启动与多实例安装

    启动方式及故障排查

    一、几个问题

    1.1 /etc/init.d/mysql 从哪来

    cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
    

    1.2 mysql能否设置成开机启动

    可以,但是没必要

    # 方法1:
    chkconfig mysql on
    # 方法2:
    echo "/etc/init.d/mysql start" >> /etc/rc.local
    

    1.3 开机启动?

    有没有必要把MySQL设置为开机启动

    如果线上库,建议关闭自动启动,线上库本着一个原则,出错了就停下来,用脚本批量启动

    1.4 配置文件位置及加载顺序

    mysqld可以加载哪些位置的配置文件

    mysql global status | grep my.cnf
    mysql --help | grep my.cnf
    mysqld --verbose --help | grep my.cnf
    
    man mysqld
    mysqld --verbose --help | grep defaults-file
    --defaults-file=#       Only read default options from the given file #.
    
    # my.cnf加载顺序:
    # /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 
    

    1.5 mysql的启动方式

    # 1
    /etc/init.d/mysql start
    # 2(1与2都是调用的mysql.server)
    service mysql start
    # 3
    /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &
    # 4
    /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf &
    
    # mysql.server调用的mysqld_safe
    # mysqld_safe调用的mysqld (mysqld_safe是mysqld的守护进程,会自动重启)
    
    # 建议用如下启动方式,一机多实例启动也就简单了
    # mysqld_safe启动,mysqld进程挂掉,会自动重启,不便于定位问题
    /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf &
    /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3376/my3376.cnf &
    /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3377/my3377.cnf &
    
    # 关闭
    /usr/local/mysql/bin/mysqladimn -S /tmp/mysql3376.sock shutdown
    

    二、为什么推荐用mysqld启动

    1. mysqld_safe是mysqld的守护进程
    2. 一机多实例启动也就简单了
    3. mysqld_safe启动,mysqld进程挂掉,会自动重启,不便于定位问题

    三、一机多实例

    3.1 场景

    1. 防止两个业务之间影响,每个业务需要的资源不大,2、3G内存就够了

    2. MySQL随着连接数的上升性能会下降,通过拆分实例降低连接数

    3. 不同端口号跑不同的业务

      3376->userdb

      3377->cmsdb

    3.2 技巧,减少误操作

    一组MySQL用一个唯一端口号,所有的组之间不要重复

    如:一组对应的一主两从

    3.3 实现

    1. 创建目录
    mkdir -p /data/mysql/mysql3377/{data,tmp,logs}
    
    2. 修改配置文件,端口
    # cp /data/mysql/mysql3376/mysql3376.cnf /data/mysql/mysql3377/mysql3377.cnf
    # cp /etc/my.cnf /data/mysql/mysql3377/mysql3377.cnf
    # sed -i 's/3376/3377/g' /data/mysql/mysql3377/mysql3377.cnf
    cp /etc/my.cnf /etc/mysql3377.cnf
    sed -i 's/3376/3377/g' /etc/mysql3377.cnf
    
    3. 修改权限
    sudo chown -R mysql:mysql /data/mysql/mysql3377
    
    4. 初始化,指定配置文件
    cd /usr/local/mysql
    # ./scripts/mysql_install_db --defaults-file=/data/mysql/mysql3377/mysql3377.cnf
    sudo ./scripts/mysql_install_db --defaults-file=/etc/mysql3377.cnf
    
    5. 通过mysqld启动
    # mysqld --defaults-file=/data/mysql/mysql3377/mysql3377.cnf &
    mysqld --defaults-file=/etc/mysql3377.cnf &
    
    6. 安全加固
    mysql -S /tmp/mysql3377.sock
    
    7. 关闭
    mysqladimn -S /tmp/mysql3377.sock shutdown
    
    # 可以写成脚本,只需要如下3个参数
    port, bp size, appname
    $appname$port
    

    四、mysqld_multi

    1. mysqld_multi是用一个配置文件实现一机多实例
    2. mysqld_multi可以调用mysqld_safe,也可以调用mysqld
    3. 如果mysqld_multi,建议调用mysqld_safe
    4. my.cnf必须在/etc/my.cnf这个位置
    5. http://www.cnblogs.com/LCX/archive/2010/04/02/1703215.html

    4.1 向my.cnf追加如下内容

    必须是/etc/my.cnf这默认位置的配置文件

    [mysqld_safe]的参数仅供mysqld_safe程序使用

    [mysqldN]会覆盖[mysqld]的部分,前缀必须是mysqld

    port/datadir/socket必须不能一样

    [mysqld_multi]
    mysqld = /usr/local/mysql/bin/mysqld_safe
    mysqladmin = /usr/local/mysql/bin/mysqladmin
    # 用来做关闭mysql使用
    user = root
    # password = 123456
    log = /data/mysql/mysqld_multi.log
    
    [mysqld3378]
    socket = /tmp/mysql3378.sock
    port = 3378
    datadir = /data/mysql/mysql3378/data
    user = mysql
    pid-file = /data/mysql/mysql3378/data/mysql3378.pid
    log-error = /data/mysql/mysql3378/logs/error.log
    log-bin = /data/mysql/mysql3378/logs/mysql-bin
    innodb_data_home_dir = /data/mysql/mysql3378/data
    innodb_log_group_home_dir = /data/mysql/mysql3378/logs
     
    [mysqld3379]
    socket = /tmp/mysql3379.sock
    port = 3379
    datadir = /data/mysql/mysql3379/data
    user = mysql
    pid-file = /data/mysql/mysql3379/data/mysql3379.pid
    log-error = /data/mysql/mysql3379/logs/error.log
    log-bin = /data/mysql/mysql3379/logs/mysql-bin
    innodb_data_home_dir = /data/mysql/mysql3379/data
    innodb_log_group_home_dir = /data/mysql/mysql3379/logs
    

    4.2 启动

    # 查看MySQL状态
    /usr/local/mysql/bin/mysqld_multi report
    
    # 前提是3378和3379的数据库文件已经初始化完了
    cd /usr/local/mysql
    ./scripts/mysql_install_db --defaults-file=/etc/mysql3378.cnf
    ./scripts/mysql_install_db --defaults-file=/etc/mysql3379.cnf
    
    # 启动,不加参数是启动所有实例
    /usr/local/mysql/bin/mysqld_multi start
    # 只启动3376,通过端口号指定
    /usr/local/mysql/bin/mysqld_multi start 3376
    
    # 关闭,不加参数是关闭所有实例
    mysqld_multi stop
    mysqld_multi stop 3376
    mysqladmin shutdown -S /tmp/mysql3376.sock
    

    4.3 单机跑多实例

    # 以下三个绝对不能一样
    port
    datadir
    socket
    

    server-id

    五、打包初始化

    /data/mysql/mysql3376
    # 打包前,删除auto.cnf
    rm -rf /data/mysql/mysql3376/auto.cnf
    tar -czvf mysqldata.tar.gz /data/mysql/mysql3376
    

    六、故障排查

    6.1 看错误日志

    # my.cnf定义错误日志的输出
    log-error = /data/mysql/mysql3376/logs/error.log
    
    cat /data/mysql/mysql3376/logs/error.log
    

    6.2 字典数据过大

    # 数据字典文件
    innodb_data_file_path=ibdata1:100M:autoextend
    
    # 不能改大,改小了可以
    

    6.3 ibdata1非常大

    ibdata1非常大怎么办?

    很有可能是启用了共享表空间,改成独立表空间

    共享表空间,就是把数据清理掉后,也不会回收空间

    解决:

    1. dump出来
    2. 启用独立表空间导入

    6.4 优化错误

    [mysqld_safe]
    malloc-lib = /usr/local/mysql/lib/mysql/libjemalloc.so
    

    用/etc/init.d/mysql和mysqld_safe启,连错误日志都没有写

    错误日志是由mysqld来写的,所以连mysqld都没有调用到

    解决:

    1. 把缺少的文件找来编译放进去
    2. 把这句优化注释掉

    6.5 启动mysql的用户

    2017-11-18 12:52:04 4766 [ERROR] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!
    

    以mysql身份来启动mysql ------不是这个原因

    # su - root -c "command"
    mysqld --defaults-file=/data/mysql/mysql3377/mysql3377.cnf &
    su - mysql -c "mysqld --defaults-file=/data/mysql/mysql3377/mysql3377.cnf &"
    

    my.cnf不要让其他用户有w权限

    6.6 设置error_log

    error_log必须提前创建好

    https://bugs.mysql.com/bug.php?id=84427

    6.7 权限错误

    /tmp目录权限不对

    /tmp是个特殊目录,在日常操作中,该目录会被误操作

    iptables

    firewalld

    selinux

    getenforce
    

    七、总结

    7.1 问题来源:

    目录权限问题
    优化问题

    7.2 解决思路:

    看调用关系
    看日志

    7.3 要求

    1. 能按着要求布署一个数据库3378
    2. 了解几种启动方式的调用关系
    3. 了解配置文件加载的顺序
    4. 掌握启动故障的排查思路
    5. 多实例的布署
  • 相关阅读:
    java 中静态变量和实例变量之间的区别
    java 中final 引用不可变,但是引用还是可以发生变化的
    java中char和Unicode之间的关系
    java 中终止内层循环的方法
    ssh 公钥免密码登陆
    关于Python 中unicode 转码的问题
    Python中Unicode码和非Unicode码引起的错误与格式转换
    第一次写博客,怎么写?
    zookeeper实现主-从结构的一般原理
    Python中Tuple的词源有趣探索
  • 原文地址:https://www.cnblogs.com/okokabcd/p/8476692.html
Copyright © 2011-2022 走看看