MySQL 系列(一)安装

MySQL 系列(一)安装

以 Centos7 下安装 MySQL 5.6 为例。

一、环境准备

(1) 下载

下载地址: https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz

(2) 安装依赖

yum -y install perl perl-devel autoconf libaio

(3) 卸载已安装的 MySQL

yum list installed | grep mysql  # 查询已安装的 MySQL
yum -y remove mysql-libs.x86_64  # 卸载 

(4) 创建 mysql 用户

userdel mysql           # 删除 mysql 用户
groupdel mysql          # 删除 mysql 用户组
groupadd mysql          # 创建 mysql 用户组
useradd -g mysql mysql  # 创建 mysql 用户并加入 mysql 用户组
echo mysql | passwd --stdin mysql            # mysq 添加密码

(5) sudo 免密码操作

visudo

%wheel  ALL=(ALL)         NOPASSWD: ALL

# 用户加入 wheel 组
gpasswd -a mysql wheel

二、MySQL 安装

(1) 切换到 mysql 帐号

# 切换到 mysql 帐号
su - mysql

(2) 将下载的二进制安装包解压后放到 /usr/local/mysql 目录下

sudo tar -zxvf mysql-5.6.38-linux-glibc2.12-x86_64.tar.gz
sudo mv mysql-5.6.38-linux-glibc2.12-x86_64 /usr/local/mysql

(3) 环境变量

sudo vim /etc/profile

export MYSQL_HOME=/usr/local/mysql
export PATH=$PATH:$MYSQL_HOME/bin

source /etc/profile     # 立即生效

(4) 在 etc 下新建配置文件 my.cnf

[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8 
socket=/var/lib/mysql/mysql.sock

[mysqld]
user=mysql
skip-name-resolve
#设置3306端口
port = 3306 
socket=/var/lib/mysql/mysql.sock
# 设置mysql的安装目录
basedir=/usr/local/mysql
# 设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql/data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB 
lower_case_table_names=1
max_allowed_packet=16M

说明:

  • 使用 mysqld --help -vv | grep my.cnf 查看 mysql 的配置文件读取顺序。

    [root@binarylei mysql]# mysql --help --vv | grep my.cnf
                          order of preference, my.cnf, $MYSQL_TCP_PORT,
    /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf /usr/local/mysql/my.cnf ~/.my.cnf 
    
  • 后读取的 my.cnf 中的配置,如果有相同项,会覆盖之前的配置。

  • 使用 --defaults-files 可指定配置文件。

(5) 创建 /var/lib/mysql 并将用户修改为 mysql

# my.cnf 文件中配制的 socket 目录
sudo mkdir /var/lib/mysql
sudo chown -R mysql:mysql /var/lib/mysql

(6) 初始化 MySQL

# 一定要在 mysql 的安装目录下
./scripts/mysql_install_db --user=mysql

到此 MySQL 安装完毕!下面介绍 MySQL 作为服务启动方式。

三、MySQL 启动

1、添加mysql服务开机自启动

sudo cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld    # 复制启动脚本到资源目录
sudo chmod +x /etc/rc.d/init.d/mysqld    # 增加 mysqld 服务控制脚本执行权限
sudo chkconfig --add mysqld              # 将 mysqld 服务加入到系统服务
sudo chkconfig --list mysqld             # 检查 mysqld 服务是否已经生效

命令输出类似下面的结果:

mysqld          0:off   1:off   2:on    3:on    4:on    5:on    6:off

表明 mysqld 服务已经生效,在2、3、4、5运行级别随系统启动而自动启动,以后可以使用 service 命令控制 mysql 的启动和停止。

2、启动msql

service mysqld start    # 启动 msql
service mysqld stop     # 停止msql

MySQL 启动后后有两个进程,其中 mysqld_safe 为守护进程,当 MySQL 异常关闭时会重新拉起 mysqld 进程。

root     22513     1  0 Jan04 ?        00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/binarylei.pid
mysql    22824 22513  0 Jan04 ?        00:00:45 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=binarylei.err --pid-file=/usr/local/mysql/data/binarylei.pid --socket=/var/lib/mysql/mysql.sock

四、权限控制

(1) 设置 mysql 帐号和密码

以 root 账户登陆 mysql,默认是没有密码

UPDATE mysql.user SET password=password('123456') WHERE user='root' AND host='localhost';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;

(2) 去除匿名用户

delete from mysql.user where User='';   # 删除匿名用户,使用root用户登录数据库
flush privileges;

五、MySQL 升级

以 MySQL5.6 -> 5.7 为例。如果不是跨很大的版本,通常不用 mysqldump 备份数据,直接使用 mysql_upgrade 进行升级。mysql_upgrade 建议使用 -s 参数,只升级系统表,不用升级数据表,因为如果数据量很大,会导致升级非常慢。

注意: 升级前后 my.cnf 中的配置项 datadir 参数相同。

# 更新 MySQL 软件包,直接将 mysql 软链接由 mysql-5.6 指向 mysql-5.7
service mysqld stop
unlink /usr/local/mysql
ln -sv /usr/local/lib/mysql-5.7 /usr/local/mysql
service mysqld start

# -s表示只升级系统表,通常情况下不用升级数据表 --force表示已经升级了
mysql_upgrade -s --force

mysql_upgrade -h
-f, --force         Force execution of mysqlcheck even if mysql_upgrade has
                    already been executed for the current version of MySQL.
-s, --upgrade-system-tables 
                    Only upgrade the system tables do not try to upgrade the data.

六、错误处理

MySQL 日志存储目录: my.cnf 中配制了 datadir 目录,如 datadir=/usr/local/mysql/data,在 datadir 目录下会新建一个 “主机名.err” 的文件

(1) 问题 1:Can't connect to local MySQL server through socket '/tmp/mysql.sock'

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

解决方法:

打开 /etc/my.cnf,看看里面配置的 socket 位置是什么目录,如 socket=/var/lib/mysql/mysql.sock

MySQL 服务端启动时报错,则很可能是 mysql 用户没有操作 /var/lib/mysql 的权限。一般将 /var/lib/mysql 用户修改为 mysql 用户可以解决问题。

chown -R mysql:mysql /var/lib/mysql

MySQL 客户端连接时报错,则很可能是 socket 路径和 “/tmp/mysql.sock” 不一致。建立一个软连接:

ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock

七、附录

附录1:MySQL 5.6.X 安装:

shell> yum install libaio # Debain系用户:apt-get install libaio1
shell> groupadd mysql
shell> useradd -r -g mysql mysql
shell> cd /usr/local
shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
shell> ln -s full-path-to-mysql-VERSION-OS mysql
shell> cd mysql
shell> chown -R mysql .
shell> chgrp -R mysql .
shell> scripts/mysql_install_db --user=mysql
shell> chown -R root .
shell> chown -R mysql data
shell> bin/mysqld_safe --user=mysql &
# Next command is optional
shell> cp support-files/mysql.server /etc/init.d/mysql.server 

附录2:MySQL 5.7.X 安装

shell> groupadd mysql
shell> useradd -r -g mysql mysql
shell> cd /usr/local
shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
shell> ln -s full-path-to-mysql-VERSION-OS mysql
shell> cd mysql
shell> mkdir mysql-files
shell> chmod 770 mysql-files
shell> chown -R mysql .
shell> chgrp -R mysql .
shell> bin/mysqld --initialize --user=mysql #该步骤中会产生零时
                                            #root@localhost密码
                                            #需要自己记录下来
shell> bin/mysql_ssl_rsa_setup          
shell> chown -R root .
shell> chown -R mysql data mysql-files
shell> bin/mysqld_safe --user=mysql &
# Next command is optional
shell> cp support-files/mysql.server /etc/init.d/mysql.server

附录3:my.ini 生产环境参考配置

[client]
user=root
password=12346

[mysqld]
########basic settings########
server-id = 11 
port = 3306
user = mysql
bind_address = 10.166.224.32   #根据实际情况修改
autocommit = 0   #5.6.X安装时,需要注释掉,安装完成后再打开
character_set_server=utf8mb4
skip_name_resolve = 1
max_connections = 800
max_connect_errors = 1000
datadir = /data/mysql_data      #根据实际情况修改,建议和程序分离存放
transaction_isolation = READ-COMMITTED
explicit_defaults_for_timestamp = 1
join_buffer_size = 134217728
tmp_table_size = 67108864
tmpdir = /tmp
max_allowed_packet = 16777216
sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"
interactive_timeout = 1800
wait_timeout = 1800
read_buffer_size = 16777216
read_rnd_buffer_size = 33554432
sort_buffer_size = 33554432
########log settings########
log_error = error.log
slow_query_log = 1
slow_query_log_file = slow.log
log_queries_not_using_indexes = 1
log_slow_admin_statements = 1
log_slow_slave_statements = 1
log_throttle_queries_not_using_indexes = 10
expire_logs_days = 90
long_query_time = 2
min_examined_row_limit = 100
########replication settings########
master_info_repository = TABLE
relay_log_info_repository = TABLE
log_bin = bin.log
sync_binlog = 1
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates
binlog_format = row 
relay_log = relay.log
relay_log_recovery = 1
binlog_gtid_simple_recovery = 1
slave_skip_errors = ddl_exist_errors
########innodb settings########
innodb_page_size = 8192
innodb_buffer_pool_size = 6G    #根据实际情况修改
innodb_buffer_pool_instances = 8
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_lru_scan_depth = 2000
innodb_lock_wait_timeout = 5
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_flush_method = O_DIRECT
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
innodb_log_group_home_dir = /redolog/  #根据实际情况修改
innodb_undo_directory = /undolog/      #根据实际情况修改
innodb_undo_logs = 128
innodb_undo_tablespaces = 3
innodb_flush_neighbors = 1
innodb_log_file_size = 4G               #根据实际情况修改
innodb_log_buffer_size = 16777216
innodb_purge_threads = 4
innodb_large_prefix = 1
innodb_thread_concurrency = 64
innodb_print_all_deadlocks = 1
innodb_strict_mode = 1
innodb_sort_buffer_size = 67108864 
########semi sync replication settings########
plugin_dir=/usr/local/mysql/lib/plugin      #根据实际情况修改
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000

[mysqld-5.7]
innodb_buffer_pool_dump_pct = 40
innodb_page_cleaners = 4
innodb_undo_log_truncate = 1
innodb_max_undo_log_size = 2G
innodb_purge_rseg_truncate_frequency = 128
binlog_gtid_simple_recovery=1
log_timestamps=system
transaction_write_set_extraction=MURMUR32
show_compatibility_56=on

几个重要的参数配置和说明:

  • innodb_log_file_size = 4G :做实验可以更改的小点,线上环境推荐用 4G,以前 5.5 和 5.1 等版本之所以官方给的值很小,是因为太大后有 bug,现在 bug 已经修复。

  • innodb_undo_logs = 128innodb_undo_tablespaces = 3 建议在安装之前就确定好该值,后续修改比较麻烦。

  • [mysqld][mysqld-5.7]这种 tag 表明了下面的配置在什么版本下才生效,[mysqld]下均生效。

  • autocommit,这个参数在 5.5.x 以后才有,安装 5.6.x 的时候要注意先把该参数注释掉,等安装完成后,再行打开, 5.7.X 无需预先注释。

  • datadir, innodb_log_group_home_dir, innodb_undo_directory 一定要注意他的权限是 mysql:mysql


每天用心记录一点点。内容也许不重要,但习惯很重要!

posted on 2018-05-11 20:06  binarylei  阅读(354)  评论(0编辑  收藏  举报

导航