MySQL二进制安装文档
2018/3/16 18:35:49
jesper2357@gmail.com
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 启动建议
- 注意数据库权限
- 使用mysqld_safe来启动MySQL,守护进程mysqld_safe能够重新拉起突然挂掉的mysqld服务;
- mysqld_safe --defaults-file,表示只使用这个配置文件,在多实例下非常重要,不容易读成默认配置文件
- 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服务启动后,肯定有root@localhost用户,且拥有最高权限
建议:安全期间,不在/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登陆
- 注意
- 需要用root@‘ip‘ 的用户,如root@’127.0.0.1‘
- 建议
【登陆】
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)
# 检查用户名和密码(是root@localhost,还是root@127.0.0.1)登陆
# mysql登录时会自动检查my.cnf 中 [mysql] 和 [client]的配置,因为
# cat /etc/my.cnf |more
[client]
port = 3308
socket = /data/mysql20/data/mysql.sock
所以,mysql使用socket登陆,会报错登陆root@localhost这个用户错误
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-privileges或 mysqladmin 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 root@localhost = 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用户远程登陆root@’%’,5.7没有root@‘%‘用户
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‘