MySQL二进制安装

Posted jesper

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL二进制安装相关的知识,希望对你有一定的参考价值。

mysql二进制安装文档


2018/3/16 18:35:49
[email protected]
https://dev.mysql.com/doc/refman/5.7/en/binary-installation.html

[TOC]


0、安装简略步骤

  • 安装包10.162.73.61:/data/software
  • tar -xvf mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz
  • mv mysql-5.6.36-linux-glibc2.5-x86_64/ /data/mysql
  • 上传my.cnf,创建my.cnf中的目录
  • cd $basedir,初始化
    • ./scripts/mysql_install_db --defaults-file=/etc/my36.cnf --user=mysql #5.6
    • ./bin/mysqld --defaults-file=/etc/my38.cnf --initialize-insecure --user=mysql # 5.7
  • 修改权限
    • shell> chown mysql:mysql $basedir
    • shell> chown mysql:mysql $datadir
    • shell> chmod 750 mysql-files
  • 启动数据库
    • numactl --interleave=all /data/mysql3308/bin/mysqld_safe --defaults-file=/etc/my_frontweb_snap.cnf --ledir=/data/mysql3308/bin/ & #5.6
    • numactl --interleave=all /data/mysql3308/bin/mysqld_safe --defualts-file=/etc/my.cnf & #5.7
  • 安全性改装
    • ./mysql_secure_installation -S /data/mysql3307/data/mysql.sock
  • 设置path变量
    • vim /etc/profile
    • . /etc/profile

1、配置安装环境

1.1 磁盘规划

最好将系统盘和MySQL分开:

  • 系统盘是500G的raid1
  • 独立挂载SSD盘格式化挂载作为MySQLbasedir和datadir

1.2 配置网络环境

vim /etc/sysconfig/network-scripts/ifcfg-eth0
vim /etc/sysconfig/network
vim /etc/hosts                //加入127.0.0.1和主机名的映射

1.3 执行初始化脚本

vim mysql_install_init.sh
bash ./mysql_insall_init.sh

脚本内容

modify_para(){
limit_cn=`cat /etc/security/limits.conf |grep -i ‘modify by initsys‘|wc|awk ‘{print $1}‘`
if [ $limit_cn -eq 0 ] 
then
    echo -e "\n###### modify by initsys ######" >> /etc/security/limits.conf
    echo "*        soft    nproc  1024000" >>  /etc/security/limits.conf
    echo "*        hard    nproc  1024000" >>  /etc/security/limits.conf
    echo "*        soft    nofile 1024000" >>  /etc/security/limits.conf
    echo "*        hard    nofile 1024000" >>  /etc/security/limits.conf

    echo -e "\nmysql        soft    nproc  1024000" >>  /etc/security/limits.conf
    echo "mysql        hard  nproc  1024000" >>  /etc/security/limits.conf
    echo "mysql        soft    nofile  1024000" >>  /etc/security/limits.conf
    echo "mysql        hard  nofile  1024000" >>  /etc/security/limits.conf
fi

sysctl_cn=`cat /etc/sysctl.conf |grep ‘modify by initsys‘|wc|awk ‘{print $1}‘`
if [ $sysctl_cn -eq 0 ]
then
    echo -e "\n###### modify by initsys ######" >> /etc/sysctl.conf
    echo fs.aio-max-nr = 1048576 >> /etc/sysctl.conf
    echo fs.file-max = 6815744 >> /etc/sysctl.conf
    echo vm.swappiness = 10 >> /etc/sysctl.conf
    echo net.core.rmem_max = 4194304 >> /etc/sysctl.conf
    echo net.core.wmem_default = 262144 >> /etc/sysctl.conf
    echo net.core.wmem_max = 1048586 >> /etc/sysctl.conf
    echo kernel.msgmnb = 65536 >> /etc/sysctl.conf
    echo kernel.msgmax = 655360 >> /etc/sysctl.conf
    echo kernel.sem = 250 32000 100 142 >> /etc/sysctl.conf
    echo kernel.shmmni = 4096 >> /etc/sysctl.conf
    echo kernel.shmall = 1073741824 >> /etc/sysctl.conf
    echo kernel.shmmax = 4398046511104 >> /etc/sysctl.conf
    echo net.ipv4.ip_local_port_range = 5000 65500 >> /etc/sysctl.conf
    echo net.core.rmem_default = 262144 >> /etc/sysctl.conf
    echo net.ipv4.tcp_max_syn_backlog = 8192 >> /etc/sysctl.conf
    echo net.core.somaxconn = 8192 >> /etc/sysctl.conf
    echo net.ipv4.tcp_keepalive_time = 60 >> /etc/sysctl.conf
    echo net.ipv4.tcp_keepalive_probes = 3 >> /etc/sysctl.conf
    echo net.ipv4.tcp_keepalive_intvl = 15 >> /etc/sysctl.conf
    echo net.ipv4.tcp_fin_timeout = 30 >> /etc/sysctl.conf
fi
}

modify_grub(){
#edi_flag=`cat /etc/redhat-release |grep ‘release 5‘|wc|awk ‘{print $1}‘`
#if [ $edi_flag -eq 1 ]
#then
    mv /boot/grub/grub.conf  /boot/grub/grub.conf_bak
    sed "s/.*default.*/default=1/" /boot/grub/grub.conf_bak > /boot/grub/grub.conf
    cat /boot/grub/grub.conf
#fi
}


modify_user(){
useradd mysql
usermod -G root -d /data/mysql/ mysql
}

mofify_iptables(){
/sbin/service iptables stop
/sbin/chkconfig iptables off
}


modify_para
modify_grub
modify_user
mofify_iptables

1.4 下载二进制安装包

https://dev.mysql.com/downloads/mysql/
https://downloads.mysql.com/archives/community/ #归档历史版本


2、安装MySQL

2.1 在指定目录安装mysql

1、解压

tar -xvf mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz
mv mysql-5.6.36-linux-glibc2.5-x86_64/  /data/mysql

2、新建用户

groupadd mysql 
useradd -r -g mysql -s /bin/false mysql

2.2 编辑my.cnf

1、注意

  • my.cnf 的权限是644
  • 要手工创建my.cnf中定义的一些目录,否则初始化会错误
  • 多实例环境下,可根据情景配置my.cnf名称以区分,比如/data/mysql3307目录的配置文件是/etc/my3307.cnf

2、一个简易my.cnf

#适用于所有客户端程序读取
[client]
port                    = 3306
socket                  = /data/mysql/data/mysql.sock

[mysql]
no_auto_rehash                                          # 当表多时,自动避免收集很多元数据信息,不能自动补全
prompt                  = "\\R:\\m:\\s\\d>"            #H:M:S:DB
pager                  = "more"            
default-character-set  = utf8mb4 

[mysqld]
##base setting
port                    = 3306
socket                  = /data/mysql/data/mysql.sock  #建议设置socket的位置在数据目录
server-id              = 171109
report_host            = 10.17.1.109                  # show slave status 中主机IP
basedir                = /data/mysql  
datadir                = /data/mysql/data  
tmpdir                  = /data/mysql/tmpdir 
user                    = mysql                        # 为避免用户--user=root向my.cnf文件添加选项
log_error              = error.log
innodb_file_per_table  = 1                            # 独立表空间
lower_case_table_names  = 1                            # 不区分大小写,库名、表名、表别名、变量名将以小写处理
character_set_server    = utf8mb4                                      
collation_server        = utf8mb4_bin          

##connection
skip-ssl
skip_name_resolve                  = 1                # 不解析客户端连接主机名,,授权表只用IP地址或localhost
max_connections                    = 1500              # 最大连接数
max_allowed_packet                  = 64M              # 数据包最大大小


innodb_buffer_pool_size            = 10G              # buffer pool大小,70%mem,如果设置太大超出内存,容易OOM
innodb_buffer_pool_instances        = 2                # 将缓冲池划分区域,较少池内争用

##redologfile、ibdata
innodb_flush_log_at_trx_commit      = 1                # 默认1,0提交时不写日志,每秒写日志且刷盘,1提交时写日志并刷盘,2提交时写日志,每秒刷盘
innodb_log_files_in_group          = 3                # redo log文件个数
innodb_log_file_size                = 2G                # redo log文件大小

## AS master
sync_binlog                        = 1    
log-bin                            = /data/mysql/arch/mysql-bin    # 设置binlog路径和文件前缀名称
binlog_rows_query_log_events        = 1                # 在binlog中记录原生SQL
log_bin_trust_function_creators    = 1                # 默认关闭,将function写入binlog,避免默认情况下回阻止function的创建
binlog_format                      = row              # 行模式复制
max_binlog_size                    = 1G                # binlog文件大小

## AS slave 
relay_log                          = /data/mysql/relay_log/relay-bin  # 设置relay log路径和文件前缀名称
relay_log_recovery                  = 1                # 开启新中继日志,从SQL执行位置重新拉取,清理老relay log
sync_relay_log                      = 1                # relay log的刷盘方式,0依赖OS,n,n个事件写入relay log后刷盘
skip_slave_start                    = 1                # 避免从库slave线程自动启动

2.3 初始化

  • MySQL 5.6 和5.7 初始化不同
  • 通过basedir可以初始化多个datadir

2.3.1 MySQL5.6 的初始化

cd $basedir
./scripts/mysql_install_db --defaults-file=/etc/my36.cnf --user=mysql      #version 5.6 

2.3.2 MySQL5.7 的初始化

cd $basedir
./bin/mysqld  --defaults-file=/etc/my38.cnf --initialize-insecure --user=mysql    # version 5.7

2.4 启动和关闭

2.4.1 启动建议

  1. 注意数据库权限
  2. 使用mysqld_safe来启动MySQL,守护进程mysqld_safe能够重新拉起突然挂掉的mysqld服务;
  3. mysqld_safe --defaults-file,表示只使用这个配置文件,在多实例下非常重要,不容易读成默认配置文件
  4. 5.6启动时,--ledir选项指定mysqld程序目录,非常重要

2.4.2 命令


# 修改权限
chown mysql:mysql $basedir
chown mysql:mysql $datadir
chmod 750 mysql-files



# 5.6启动
numactl --interleave=all  /data/mysql3308/bin/mysqld_safe --defaults-file=/etc/my_frontweb_snap.cnf --ledir=/data/mysql3308/bin/ &


# 5.7启动
numactl --interleave=all /data/mysql20/bin/mysqld_safe --defaults-file=/etc/my20.cnf  &
[1] 2435
#2018-03-16T10:05:19.864783Z mysqld_safe Logging to ‘/data/mysql20/data/error.log‘.


# 查看启动日志
tailf  -100 /data/mysql20/data/error.log


#关闭数据库
mysqladmin -u -p -h -P shutdown

2.4.3 启动时可能的报警和报错

  • warning 可以忽略
  • error 一般会导致数据库异常
# 告警1
could not be looked up with /data/mysql//bin/resolveip.
WARNING: The host ‘jq-db-3-22‘ could not be looked up with /data/mysql//bin/resolveip.
# 解决1
/etc/hosts 加入对hostname的解析

# 告警2
SSL context is not usable without certificate and private key
[Warning] Failed to set up SSL because of the following SSL library error: SSL context is not usable without certificate and private key
#解决2
在5.7中,通过ssl方式连接mysql被作为默认和推荐,如果不使用,skip掉
vim /etc/my.cnf 
[mysqld]
skip-ssl

# 报错3
找这个文件的时候报错:
[ERROR] InnoDB: Cannot open ‘/data/mysql/data/ib_buffer_pool‘ for reading: No such file or directory
#解决3
    ib_buffer_pool 是--innodb-buffer-pool-filename=file 这个选项是默认值。
    这个文件中放的是由于【 innodb_buffer_pool_dump_at_shutdown or innodb_buffer_pool_dump_now.】保存下来的tablespace IDs and page IDs 的一个列表。
    所以,出现这个错误的时候,可以指定innodb-buffer-pool-filename=file,或者是关闭innodb_buffer_pool_dump的几个选项。

2.5 登陆

2.5.1 本地使用socket登陆

注意,socket只能本地登录,mysqld服务启动后,肯定有[email protected]用户,且拥有最高权限
建议:安全期间,不在/tmp公共目录创建mysql的socket文件

# 登陆
mysql -pmima --socket=/data/mysql_3307/data/mysql.sock  

# 查看连接方式
17:42:25 (none)> \s
Connection:            Localhost via UNIX socket  `

2.5.2 TCP/IP登陆

【登陆】
mysql -pmima -h127.0.0.1 -P3308

【查看连接方式】
17:43:42 (none)> \s
Connection:            127.0.0.1 via TCP/IP

2.5.3 登陆错误处理

1、Access denied

# 报错
mysql -p123123
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)

# 检查用户名和密码(是[email protected],还是[email protected])登陆
# mysql登录时会自动检查my.cnf 中 [mysql] 和 [client]的配置,因为
# cat /etc/my.cnf |more
[client]
port                    = 3308
socket                  = /data/mysql20/data/mysql.sock

所以,mysql使用socket登陆,会报错登陆[email protected]这个用户错误

2、Character set ‘utf8mb4‘ is not a compiled character set

# mysql -proot 
mysql: Character set ‘utf8mb4‘ is not a compiled character set and is not specified in the ‘/usr/share/mysql/charsets/Index.xml‘ file

解决:
# yum list installed |grep mysql
mha4mysql-node.noarch              0.57-0.el6                        @/mha4mysql-node-0.57-0.el6.noarch
mysql.x86_64                        5.1.73-8.el6_8                    @base    #因为安装了这个mysql-devel时,安装了mysql5.1的客户端
mysql-devel.x86_64                  5.1.73-8.el6_8                    @base    
mysql-libs.x86_64                  5.1.73-8.el6_8                    @base    
zabbix-web-mysql.noarch            3.4.7-1.el6                        @zabbix  

# yum remove mysql.x86_64 

2.6 密码破解

通过选项skip-grant-tables来启动数据库:

  • --skip-grant-tables选项,此选项使服务器根本无需使用权限系统即可启动,使得所有人访问数据库不需要密码
  • 登陆后,通过set 或者alter 修改用户密码
  • 在shell中执行mysqladmin flush-privilegesmysqladmin reload命令,或登陆mysql后,flush privilege 让MySQL Serer重新加载授权表
# 启动
numactl --interleave=all  /data/mysql3308/bin/mysqld_safe --defualts-file=/etc/my.cnf  --skip-grant-tables & 
[1] 2435

# 登陆
mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.

#加载授权表,否则ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
18:06:28(none)>flush privileges;

#修改密码
set password for [email protected] = password(‘root‘);

2.7 MySQL进程检测

1、进程检测

# 检测命令
ps -ef |grep mysqld
ps aux |grep mysqld

# 进程信息
root    36133 21704  0 17:35 pts/1    00:00:00 /bin/sh /data/mysql3308/bin/mysqld_safe --defaults-file=/etc/my_frontweb_snap.cnf --ledir=/data/mysql3308/bin/
mysql    36978 36133  1 17:35 pts/1    00:00:06 /data/mysql3308/bin//mysqld --defaults-file=/etc/my_frontweb_snap.cnf --basedir=/data/mysql3308 --datadir=/data/mysql3308/data --plugin-dir=/data/mysql3308/lib/plugin --user=mysql --log-error=/data/mysql3308/data/error.log --open-files-limit=655350 --pid-file=/data/mysql3308/data/hadoop-jq-9-31.pid --socket=/data/mysql3308/data/mysql.sock --port=3308

# 关于进程号
可以从进程号中看出,root用户启动了mysqld_safe进程,mysql的父进程是mysqld_safe进程,也就是说,mysqld_safe拉起了mysql的mysqld程序

2、端口检测

# netstat检测
netstat -an |grep 3306

tcp        0      0 10.17.9.31:22261            10.17.1.110:3306            ESTABLISHED 
tcp        0      0 :::3306                    :::*                        LISTEN  


# lsof检测,需要安包
rpm -qf `which lsof`
lsof-4.82-4.el6.x86_64

lsof -i:3306 
COMMAND  PID  USER  FD  TYPE    DEVICE SIZE/OFF NODE NAME
mysqld  3229 mysql  16u  IPv6    15009      0t0  TCP *:mysql (LISTEN)

3、客户端检测

# mysql登录检测
能使用mysql登录指定mysqld服务,服务肯定是在运行的


# mysqladmin ping检测
mysqladmin -pmima  ping      
mysqld is alive

3、安装善后操作

3.1 mysql_secure_installation安全性改装

1、简介

  • 这和mysql一样,是一个客户端程序,程序在$basedir/bin/下
  • /data/mysql/bin/mysql_secure_installation
  • 作用是改进安装安全性,建议版本低于5.7的一定使用

2、如何使用

./mysql_secure_installation --help

# ./mysql_secure_installation -S /data/mysql3307/data/mysql.sock

Securing the MySQL server deployment.
Enter password for user root: 


mysql_secure_installation
Enter current password for root (enter for none):      # 密码为空,直接回车
Change the root password? [Y/n] Y                      #修改密码
Remove anonymous users? [Y/n] y                        #移除匿名用户.              ,5.7默认没有匿名用户
Disallow root login remotely? [Y/n] y                  #禁止root用户远程登陆[email protected]’%’,5.7没有[email protected]‘%‘用户
Remove test database and access to it? [Y/n] y          #移除test数据库              ,5.7无test数据库
Reload privilege tables now? [Y/n] y                    #刷新权限表

3.2 PATH 变量设置

1、优缺点

  • 优点
    • 设置path变量之后,对于mysql的很多程序都能直接使用
  • 缺点
    • 对于多实例的情况下,很容易造成生产的问题,比如:
    • 已有5.6mysql服务在运行,PATH变量设置的$5.6basedir/bin,想初始化或启动5.7的服务,必须使用5.7的绝对路径的命令,不然启动了一个5.6mysqld服务

2、如何设置

# 编辑文件
vim /etc/profile

#最后追加,以‘:‘分隔
PATH=$PATH:/data/mysql3308/bin

# 生效
. /etc/profile

3.3 开机自启

不在生产环境中使用开启自动启动mysqld服务。以为server一般不会重启,故障大都是硬件侧面,使用HA提供持续服务

3.3.1 创建系统service服务

利用$basedir/support-files/mysql.server 脚本创建/etc/init.d/mysqld 的快捷启动

#1、创建服务
cp $basedir/support-files/mysql.server /etc/init.d/mysqld        
修改脚本
chkconfig mysql on


#2、修改修改/etc/init.d/mysqld 脚本内容
#266行  
numactl --interleave=all /ssd_data/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf  &


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


#3、将mysqld服务开机启动
chkcofig mysqld on     #开机启动
chkconfig --list |grep mysqld    #查看启动项

3.3.2 启动命令加入rc.local

将mysqld_safe启动命令放到 /etc/rc.local中

cat /etc/rc.local
#追加内容:
numactl --interleave=all /ssd_data/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf  &

3.4 alias设置

创建alias别名命令,并写入系统配置文件

vim  /etc/profile
# 追加一下内容
alias mysql3306=‘mysql -uroot -p123123 -h127.0.0.1 -P3306‘
alias mysql3306shutdown=‘mysql -uroot -p123123 -h127.0.0.1 -P3306 shutdown‘
alias mysqlstartup=‘/etc/init.d/mysql start‘
alias vimmycnf=‘vim /export/servers/mysql/etc/my.cnf‘




以上是关于MySQL二进制安装的主要内容,如果未能解决你的问题,请参考以下文章

Redhat Linux上mysql安装-binary package安装

Linux平台下安装MySQL

Mysql的二进制安装和基础入门操作

源码安装部署MySQL数据库 二进制安装部署MySQL数据库 yum安装数据库

怎样区分linux下的二进制和源代码Mysql包?

mysql基础进阶