共计 17262 个字符,预计需要花费 44 分钟才能阅读完成。
MySQL 二进制安装,升级,多实例部署
目标
- 理解线上部署考虑的因素
- 学会编译安装以及二进制安装 mysql
- 学会升级 mysql
- 学会多实例部署 mysql 数据库
- 学会合理部署 mysql 线上库
考虑因素:
- 版本选择,5.1,5.5 还是 5.6?
- 分支选择, 官方社区版 ?percona server?mariadb?
-
- 推荐官方版,简单易上手
- 安装方式,包安装?二进制包安装?源码安装?
-
- 线上推荐二进制包安装
- 路径配置,参数配置(尽量模板化,标准化)
- 一个实例多个库,or 多个实例单个库?
二进制安装 mysql
- 下载软件安装包
- 解压放到指定目录(比如 /usr/local)并将 mysql 目录放到 PATH 中
- 初始化实例,编辑配置文件 并启动
- 账号安全设置
1) 下载
mysql-5.5.50-linux2.6-i686
2) 解压到指定目录,并将 mysql 目录放到 PATH 中
#tar -zxf mysql-5.5.50-linux2.6-i686.tar.gz
#mv mysql-5.5.50-linux2.6-i686 /usr/local/
#cd /usr/local
#mv mysql-5.5.50-linux2.6-i686 mysql55
#cd mysql55/bin
#export PATH=/usr/local/mysql55/bin:$PATH
3) 初始化实例 使用脚本 mysql_install_db
#mkdir -p /tmp/mysqldata/node1
#/usr/local/mysql55/script/mysql_install_db --user=mysql --basedir=/usr/local/mysql55 --datadir=/tmp/mysqldata/node1
#cd /tmp/mysqldata/node1
出现问题 1 没有 libaio.so.1 库
/tmp/mysql55/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
解决:查询 libaio 库并按照 libaio.so.1
查询
linuxidc@linuxidc:/tmp$ sudo apt-cache search libaio
libaio-dev - Linux kernel AIO access library - development files
libaio1 - Linux kernel AIO access library - shared library
libaio1-dbg - Linux kernel AIO access library - debugging symbols
安装
linuxidc@linuxidc:/tmp$ sudo apt-get install libaio1
初始化成功:
linuxidc@linuxidc:/usr/local/mysql/data$ ls -l /tmp/mysqldata/node1/
total 12
drwx------ 2 linuxidc linuxidc 4096 7 月 27 21:27 mysql
drwx------ 2 linuxidc linuxidc 4096 7 月 27 21:27 performance_schema
drwx------ 2 linuxidc linuxidc 4096 7 月 27 21:25 test
拷贝配置文件:support-files 中拷贝 my-medium.cnf
cp /usr/local/mysql56/support-files/my-medium.cnf /tmp/mysqldata
3) 使用 mysqld_safe 脚本,启动
/usr/local/mysql55/bin/mysqld_safe --defaults-file=/tmp/mysqldata/my.cnf &
问题 2:没有 /usr/local/mysql/data 目录
解决:创建目录并赋权
linuxidc@linuxidc:/usr/local$ sudo mkdir -p mysql/data
linuxidc@linuxidc:/usr/local/mysql$ sudo chown -R linuxidc .
linuxidc@linuxidc:/usr/local/mysql$ sudo chgrp -R linuxidc .
问题 3:不存 /usr/local/mysql/bin/mysqld 文件
linuxidc@linuxidc:/usr/local/mysql$ /usr/local/mysql55/bin/mysqld_safe --defaults-file=/tmp/mysqldata/my.cnf &
[1] 3773
linuxidc@linuxidc:/usr/local/mysql$ 160727 21:37:32 mysqld_safe Logging to '/usr/local/mysql/data/linuxidc.err'.
160727 21:37:32 mysqld_safe The file /usr/local/mysql/bin/mysqld
does not exist or is not executable. Please cd to the mysql installation
directory and restart this script from there as follows:
./bin/mysqld_safe&
See http://dev.mysql.com/doc/mysql/en/mysqld-safe.html for more information
^C
[1]+ Exit 1 /usr/local/mysql55/bin/mysqld_safe --defaults-file=/tmp/mysqldata/my.cnf
怀疑 Ubuntu 定死了 basedir 在 /usr/local/mysql 下
解决:拷贝 mysql55 中内容到该目录中
linuxidc@linuxidc:/usr/local/mysql$ cp -ar ../mysql55/* .
问题 4:mysqld 从 /usr/local/mysql/data 中启动库文件;
查看 linuxidc.err: 需要的一些表不在 /usr/local/mysql/data
160727 21:41:59 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data
160727 21:41:59 [Note] /usr/local/mysql/bin/mysqld (mysqld 5.5.50-log) starting as process 4500 ...
160727 21:41:59 [Note] Plugin 'FEDERATED' is disabled.
/usr/local/mysql/bin/mysqld: Table 'mysql.plugin' doesn't exist
160727 21:41:59 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
160727 21:41:59 InnoDB: The InnoDB memory heap is disabled
160727 21:41:59 InnoDB: Mutexes and rw_locks use GCC atomic builtins
160727 21:41:59 InnoDB: Compressed tables use zlib 1.2.3
160727 21:41:59 InnoDB: Using Linux native AIO
160727 21:41:59 InnoDB: Initializing buffer pool, size = 128.0M
160727 21:41:59 InnoDB: Completed initialization of buffer pool
160727 21:41:59 InnoDB: highest supported file format is Barracuda.
InnoDB: Log scan progressed past the checkpoint lsn 48941
160727 21:41:59 InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer...
InnoDB: Doing recovery: scanned up to log sequence number 1595675
160727 21:41:59 InnoDB: Starting an apply batch of log records to the database...
InnoDB: Progress in percents: 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
InnoDB: Apply batch completed
160727 21:41:59 InnoDB: Waiting for the background threads to start
160727 21:42:00 InnoDB: 5.5.50 started; log sequence number 1595675
160727 21:42:00 [Note] Recovering after a crash using mysql-bin
160727 21:42:00 [Note] Starting crash recovery...
160727 21:42:00 [Note] Crash recovery finished.
160727 21:42:00 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306
160727 21:42:00 [Note] - '0.0.0.0' resolves to '0.0.0.0';
160727 21:42:00 [Note] Server socket created on IP: '0.0.0.0'.
160727 21:42:00 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist
160727 21:42:00 mysqld_safe mysqld from pid file /usr/local/mysql/data/linuxidc.pid ended
解决:将原初始化的 datadir 目录中所有拷贝过去
linuxidc@linuxidc:/usr/local/mysql/data$ rm -rf test/
linuxidc@linuxidc:/usr/local/mysql/data$ cp -ar /tmp/mysqldata/node1/* .
成功安装:
linuxidc@linuxidc:/usr/local/mysql/data$ ps -ef | grep mysqld
linuxidc 4536 2146 0 21:43 pts/0 00:00:00 /bin/sh /usr/local/mysql55/bin/mysqld_safe --defaults-file=/tmp/mysqldata/my.cnf
linuxidc 4773 4536 1 21:43 pts/0 00:00:00 /usr/local/mysql/bin/mysqld --defaults-file=/tmp/mysqldata/my.cnf --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --log-error=/usr/local/mysql/data/linuxidc.err --pid-file=/usr/local/mysql/data/linuxidc.pid --socket=/tmp/mysql.sock --port=3306
linuxidc 4792 2097 0 21:44 pts/2 00:00:00 grep --color=auto mysqld
疑问:
不知是 Ubuntu 指定了 basedir=/usr/local/mysql,datadir=/usr/local/mysql/data; 还是最开始的初始化没有管用,还是有什么配置没有写在配置文件中。
当然是没有写在配置文件中了,可以查看一下 my-medium.cnf 内容
[client]
#password = your_password
port = 3306
socket = /tmp/mysql.sock
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
没有相关目录的配置;
增加启动配置参考:mysqld_safe — MySQL Server Startup Script
在 my.cnf 增加一下配置
my.cnf
port = 3306
socket = /tmp/mysqldata/node1/mysql.sock
[mysqld_safe]
user=linuxidc
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
port = 3306
socket = /tmp/mysqldata/node1/mysql.sock
pid-file = /tmp/mysqldata/node1/mysqld.pid
basedir = /usr/local/mysql55
datadir = /tmp/mysqldata/node1
innodb_data_home_dir = /tmp/mysqldata/node1
innodb_log_group_home_dir =/tmp/mysqldata/node1
tmpdir = /tmp/mysqldata/node1
log-error = /tmp/mysqldata/node1/linuxidc.log
log-bin = /tmp/mysqldata/node1/mysql-bin.log
重新启动
问题一:配置文件权限太大
linuxidc@linuxidc:/usr/local/mysql$ /usr/local/mysql55/bin/mysqld_safe --defaults-file=/tmp/mysqldata/my.cnf &
Warning: World-writable config file '/tmp/mysqldata/my.cnf' is ignored
解决:降权
linuxidc@linuxidc:sudo chmod 600 /tmp/mysqldata/my.cnf
问题二:bin 目录未指定
linuxidc@linuxidc:/usr/local/mysql$ /usr/local/mysql55/bin/mysqld_safe --defaults-file=/tmp/mysqldata/my.cnf &
160806 16:07:29 mysqld_safe The file /usr/local/mysql/bin/mysqld does not exist or is not executable. Please cd to the mysql installation
directory and restart this script from there as follows: ./bin/mysqld_safe&
解决:在配置文件中通过 ledir 指定 bin 目录
#my.cnf 增加
ledir = /usr/local/mysql55
问题三:linuxidc.err 报错,插件被禁止
160806 16:48:46 [Note] Plugin 'FEDERATED' is disabled.
160806 16:48:46 InnoDB: The InnoDB memory heap is disabled
160806 16:48:46 InnoDB: Mutexes and rw_locks use GCC atomic builtins
160806 16:48:46 InnoDB: Compressed tables use zlib 1.2.3
160806 16:48:46 InnoDB: Using Linux native AIO
160806 16:48:46 InnoDB: Initializing buffer pool, size = 128.0M
解决:在配置文件中启用,nice=0
#my.cnf 增加
nice = 0
4) 账号安全设置
# 删除空用户
mysql -uroot --socket=/tmp/mysql.sock
select user,host,password from mysql.user;
delete from mysql.user where user='';
delete from mysql.user where host<>'localhost';
mysql> select user,host,password from mysql.user;
+------+-----------+----------+
| user | host | password |
+------+-----------+----------+
| root | localhost | |
+------+-----------+----------+
1 row in set (0.00 sec)
# 设置 root 密码
mysql> set password for root@'localhost'=password('000000');
Query OK, 0 rows affected (0.00 sec)
# 使设置生效
flush privileges;
# 删除 test 库
看看只读权限的 test 用户能用 test 库做什么
创建 test 用户
#mysql -uroot -p123456--socket=/tmp/mysql.sock
grant select on *.* to test@'localhost' identified by '123';
使用 test 用户,在 test 库中建表
#mysql -utest -p123 --socket=/tmp/mysql.sock
use test
create table t1(id int);
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| t1 |
+----------------+
1 row in set (0.01 sec)
删除 test 库
mysql> drop database test;
Query OK, 1 row affected (0.01 sec)
mysql 升级
从 5.5 升级到 5.6
- 下载 mysql5.6 安装包并配置 mysql5.6 安装包安装路径
- 关闭 mysql5.5 的实例,修改部分参数,使用 mysql5.6 软件启动
- 执行 mysql5.6 路径下 mysql_upgrade 脚本
- 验证是否成功升级
MySQL 升级
1) 关闭 mysql
查看 mysql 是否启动
linuxidc@linuxidc:/tmp/mysqldata$ ps -ef | grep mysqld
linuxidc 4931 2146 0 22:32 pts/0 00:00:00 /bin/sh /usr/local/mysql55/bin/mysqld_safe --defaults-file=/tmp/mysqldata/my.cnf
linuxidc 5168 4931 0 22:32 pts/0 00:00:00 /usr/local/mysql/bin/mysqld --defaults-file=/tmp/mysqldata/my.cnf --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --log-error=/usr/local/mysql/data/linuxidc.err --pid-file=/usr/local/mysql/data/linuxidc.pid --socket=/tmp/mysql.sock --port=3306
linuxidc 5187 4889 0 22:33 pts/13 00:00:00 grep --color=auto mysqld
使用 mysqladmin 工具关闭 mysql 服务
linuxidc@linuxidc:/usr/local/mysql$ mysqladmin -uroot --socket=/tmp/mysql.sock shutdown -p
Enter password:
160727 22:28:46 mysqld_safe mysqld from pid file /usr/local/mysql/data/linuxidc.pid ended
[1]+ Done /usr/local/mysql55/bin/mysqld_safe --defaults-file=/tmp/mysqldata/my.cnf (wd: /usr/local/mysql/data)
(wd now: /usr/local/mysql)
检查是否关闭
linuxidc@linuxidc:/usr/local/mysql$ ps -ef | grep mysqld
linuxidc 4918 2146 0 22:28 pts/0 00:00:00 grep --color=auto mysqld
2) 更改 my.cnf
#vim my.cnf(把 55 目录都改成 56 的)
3)使用 mysql5.6 启动软件;
# 使用 5.6 拉起实例
linuxidc@linuxidc:/tmp/mysqldata$ /usr/local/mysql56/bin/mysqld_safe --defaults-file=/tmp/mysqldata/my.cnf &
[1] 9121
linuxidc@linuxidc:/tmp/mysqldata$ 160806 21:29:11 mysqld_safe Logging to '/tmp/mysqldata/node1/linuxidc.log'.
160806 21:29:11 mysqld_safe Starting mysqld daemon with databases from /tmp/mysqldata/node1
# 查看 mysqld 进程有没有起来
linuxidc@linuxidc:/tmp/mysqldata$ ps -ef | grep mysql
linuxidc 9121 8547 0 21:29 pts/2 00:00:00 /bin/sh /usr/local/mysql56/bin/mysqld_safe --defaults-file=/tmp/mysqldata/my.cnf
linuxidc 9489 9121 0 21:29 pts/2 00:00:00 /usr/local/mysql56/bin/mysqld --defaults-file=/tmp/mysqldata/my.cnf --basedir=/usr/local/mysql56 --datadir=/tmp/mysqldata/node1 --plugin-dir=/usr/local/mysql56/lib/plugin --log-error=/tmp/mysqldata/node1/linuxidc.log --pid-file=/tmp/mysqldata/node1/mysqld.pid --socket=/tmp/mysqldata/node1/mysql.sock --port=3306
linuxidc 9564 8547 0 21:35 pts/2 00:00:00 grep --color=auto mysql
# 登陆后查看 mysql 状态
mysql> status
--------------
mysql Ver 14.14 Distrib 5.6.32, for linux-glibc2.5 (x86_64) using EditLine wrapper
Connection id: 3
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.6.32-log MySQL Community Server (GPL)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /tmp/mysqldata/node1/mysql.sock
Uptime: 7 min 27 sec
Threads: 1 Questions: 5 Slow queries: 0 Opens: 32 Flush tables: 1 Open tables: 25 Queries per second avg: 0.011
--------------
4)升级库 mysql_upgrade
linuxidc@linuxidc:/tmp/mysqldata$ /usr/local/mysql56/bin/mysql_upgrade -uroot --socket=/tmp/mysqldata/node1/mysql.sock -p
Enter password:
Looking for 'mysql' as: /usr/local/mysql56/bin/mysql
Looking for 'mysqlcheck' as: /usr/local/mysql56/bin/mysqlcheck
Running 'mysqlcheck' with connection arguments: '--socket=/tmp/mysqldata/node1/mysql.sock'
Warning: Using a password on the command line interface can be insecure.
Running 'mysqlcheck' with connection arguments: '--socket=/tmp/mysqldata/node1/mysql.sock'
Warning: Using a password on the command line interface can be insecure.
mysql.columns_priv OK
mysql.db OK
mysql.event OK
mysql.func OK
mysql.general_log OK
mysql.help_category OK
mysql.help_keyword OK
mysql.help_relation OK
mysql.help_topic OK
mysql.host OK
mysql.ndb_binlog_index OK
mysql.plugin OK
mysql.proc OK
mysql.procs_priv OK
mysql.proxies_priv OK
mysql.servers OK
mysql.slow_log OK
mysql.tables_priv OK
mysql.time_zone OK
mysql.time_zone_leap_second OK
mysql.time_zone_name OK
mysql.time_zone_transition OK
mysql.time_zone_transition_type OK
mysql.user OK
Running 'mysql_fix_privilege_tables'...
Warning: Using a password on the command line interface can be insecure.
Running 'mysqlcheck' with connection arguments: '--socket=/tmp/mysqldata/node1/mysql.sock'
Warning: Using a password on the command line interface can be insecure.
Running 'mysqlcheck' with connection arguments: '--socket=/tmp/mysqldata/node1/mysql.sock'
Warning: Using a password on the command line interface can be insecure.
OK
View Code
# 验证库有没有升级成功
linuxidc@linuxidc:/tmp/mysqldata$ /usr/local/mysql56/bin/mysql_upgrade -uroot --socket=/tmp/mysqldata/node1/mysql.sock -p
Enter password:
Looking for 'mysql' as: /usr/local/mysql56/bin/mysql
Looking for 'mysqlcheck' as: /usr/local/mysql56/bin/mysqlcheck
This installation of MySQL is already upgraded to 5.6.32, use --force if you still need to run mysql_upgrade
mysql 多实例安装
- 部署好 mysql 软件
- 编辑多个配置文件,初始化多个实例
- 启动 mysql 实例
为啥多实例部署?
- 充分利用系统资源
- 资源隔离
- 业务,模块隔离
多实例安装
#mkdir -p /mysqldata/node3
a) 初始化实例 使用脚本 mysql_install_db
linuxidc@linuxidc:/tmp/mysqldata/node1$ /usr/local/mysql56/scripts/mysql_install_db --user=linuxidc --basedir=/usr/local/mysql56 --datadir=/tmp/mysqldata/node3
#查看
linuxidc@linuxidc:/tmp/mysqldata/node1$ ls ../node3
ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema test
b) 给 node3 配置文件
cp my2.cnf my3.cnf
vim my3.cnf(修改相关参数)
[client]
#password = your_password
port = 3308
socket = /tmp/mysqldata/node3/mysql.sock
[mysqld_safe]
user=linuxidc
ledir = /usr/local/mysql56/bin
#ledir = /usr/local/mysql55/bin
nice = 0
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
port = 3308
socket = /tmp/mysqldata/node3/mysql.sock
pid-file = /tmp/mysqldata/node3/mysqld.pid
basedir = /usr/local/mysql56
#basedir = /usr/local/mysql55
datadir = /tmp/mysqldata/node3
innodb_data_home_dir = /tmp/mysqldata/node3
innodb_log_group_home_dir = /tmp/mysqldata/node3
tmpdir = /tmp/mysqldata/node3
log-error = /tmp/mysqldata/node3/linuxidc.log
log-bin = /tmp/mysqldata/node3/mysql-bin.log
c) 使用 mysqld_safe, 及 my3.cnf 拉起实例
linuxidc@linuxidc:/tmp/mysqldata/node3$ /usr/local/mysql56/bin/mysqld_safe --defaults-file=/tmp/mysqldata/node3/my3.cnf &
[2] 9861
linuxidc@linuxidc:/tmp/mysqldata/node3$ 160806 22:03:17 mysqld_safe Logging to '/tmp/mysqldata/node3/linuxidc.log'.
160806 22:03:17 mysqld_safe Starting mysqld daemon with databases from /tmp/mysqldata/node3
d)查看
linuxidc@linuxidc:/tmp/mysqldata/node3$ ps -ef | grep mysqld
linuxidc 9121 8547 0 21:29 pts/2 00:00:00 /bin/sh /usr/local/mysql56/bin/mysqld_safe --defaults-file=/tmp/mysqldata/my.cnf
linuxidc 9489 9121 0 21:29 pts/2 00:00:02 /usr/local/mysql56/bin/mysqld --defaults-file=/tmp/mysqldata/my.cnf --basedir=/usr/local/mysql56 --datadir=/tmp/mysqldata/node1 --plugin-dir=/usr/local/mysql56/lib/plugin --log-error=/tmp/mysqldata/node1/linuxidc.log --pid-file=/tmp/mysqldata/node1/mysqld.pid --socket=/tmp/mysqldata/node1/mysql.sock --port=3306
linuxidc 9861 8547 0 22:03 pts/2 00:00:00 /bin/sh /usr/local/mysql56/bin/mysqld_safe --defaults-file=/tmp/mysqldata/node3/my3.cnf
linuxidc 10327 9861 0 22:03 pts/2 00:00:00 /usr/local/mysql56/bin/mysqld --defaults-file=/tmp/mysqldata/node3/my3.cnf --basedir=/usr/local/mysql56 --datadir=/tmp/mysqldata/node3 --plugin-dir=/usr/local/mysql56/lib/plugin --log-error=/tmp/mysqldata/node3/linuxidc.log --pid-file=/tmp/mysqldata/node3/mysqld.pid --socket=/tmp/mysqldata/node3/mysql.sock --port=3308
linuxidc 10350 8547 0 22:04 pts/2 00:00:00 grep --color=auto mysqld
可以看到有两个端口的 mysqld,分别是 3306,3308;
e) 登陆新实例,删除 test 库,空用户,设置 root 密码
linuxidc@linuxidc:/tmp/mysqldata/node3$ mysql -uroot --socket=/tmp/mysqldata/node3/mysql.sock
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.32-log MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
delete from msyql.user where user='';
delete from mysql.user where host<>'localhost';
set password for root@'localhost'=password('000000');
delete from mysql.db;
drop database test;
flush privileges;
mysql 线上安装小结
- 根据需求选择合适的版本以及分支,建议使用或升级到较高版本 5.5 或 5.6
- 如果需要定制 mysql 功能的话,可以考虑编译安装,否则的话建议使用二进制包安装,比较省事。
- 根据机器配置选择部署多个 mysql 实例还是单个实例,机器配置非常好的话,建议部署多实例
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-08/133978.htm
正文完
星哥玩云-微信公众号