mysql5.1升级5.7教程
安装前工作:
1.从官方网址下载MySQL5.7.20源码包,
https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.20.tar.gz
2.解压进入mysql源码目录
mysql5.7.20源码放在/usr/local/src1
2cd /usr/local/src
tar zxvf mysql-5.7.20.tar.gz
3.编译mysql源码1
2#yum -y install gcc gcc-c++ autoconf automake zlib* fiex* libxml* ncurses-devel libmcrypt* libtool-ltdl-devel* make cmake libaio libaio-devel autoconf bzr bison libtool
#yum -y install gcc gcc-c++ ncurses ncurses-devel cmake
1.在DB主机上编译安装mysql5.7
编译与安装:1
2
3
4
5
6
7
8
9
10
11
12cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql5.7 \
-DMYSQL_DATADIR=/var/lib/mysql5.7 \
-DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql5.7.sock \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DEXTRA_CHARSETS=all \
-DENABLED_LOCAL_INFILE=1 \
-DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=/usr/local/boost/boost_1_59_0
make && make install
#boot_1_59_0下载失败,手动下载解压tar xzf boost_1_59_0.tar.gz
2.环境配置1
2
3
4
5
6chown -R mysql:mysql /usr/local/mysql5.7
chown -R mysql.mysql /var/lib/mysql5.7
cd /usr/local/mysql5.7
cp ./my.cnf /etc/mysql5.7/my.cnf --暂时将my.cnf中的端口改为4306,将sock文件都加上一个5.7的后缀,因为要和mysql5.1同时运行。
cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld5.7 --暂时命名为mysqld5.7
3.初始化数据库1
2cd /usr/local/mysql5.7
./mysqld --initialize --defaults-file=/etc/mysql5.7/my.cnf --basedir=/usr/local/mysql5.7 --datadir=/var/lib/mysql5.7 --user=mysql
#在MySQL 5.6版本以前是 bin/mysql_install_db –user
#在4306端口上启动mysql5.7的数据库1
/etc/init.d/mysqld5.7 start
#重置root密码1
/usr/local/mysql5.7/bin/mysqladmin --port=4306 --socket=/var/lib/mysql/mysql5.7.sock -uroot -hlocalhost password '123456'
#登录以验证服务可用性1
/usr/local/mysql5.7/bin/mysql --port=4306 --socket=/var/lib/mysql/mysql5.7.sock -uroot -p
以上步骤,在线上实施业务库升级前均要实施完成。
线上实施工作
1.切换线上业务至备用DB,停DB主机的mysql5.1的数据库
mkdir -p /data/backup/20171116
1.1备份数据库主机上5.1数据库中的”mysql”库1
mysqldump -A -uroot -p > /data/backup/20171116/backup_mysql.sql
备份该元数据库,以防后面升级失败时用于回撤。
1.2停db主机上原3306端口的5.1数据库1
service mysqld stop
移走原mysql5.1使用的配置文件和服务启动脚本:1
2
3mkdir -p /data/backup/20161027
mv /etc/my.cnf /data/backup/20161027
mv /etc/init.d/mysqld /data/backup/20161027
2.使用mysql_upgrade升级数据库5.7版本
这里采用的是in place升级方式,主要特点是直接把原5.1数据库的数据目录交给新编译安装的mysql5.7使用,但这需要处理一些兼容性问题。
详细介绍参见以下链接:
http://dev.mysql.com/doc/refman/5.7/en/upgrading.html#upgrade-procedure-inplace
2.1登录db主机关闭5.1的数据库1
service mysqld stop
如果5.7的库仍然在4306端口运行着,此时同样也要关闭。1
/etc/init.d/mysqld5.7 stop
2.2修改/etc/my.cnf
注释掉table_cache = 1500 这一行参数,因为高版本的mysql会因不支持该参数而启动失败。
删除/etc/mysql5.7/my.cnf目录,该目录及配置文件是之前基于4306端口运行mysql5.7时所使用的。
2.3修改mysql服务管理脚本mysqld1
2mv /etc/init.d/mysqld5.7 /etc/init.d/mysqld
vi /etc/init.d/mysqld
首先将以下两行参数,第一行设为/etc/my.cnf,第二行直接把–defaults-file部分删除。1
2conf=/etc/mysql5.7/my.cnf
$bindir/mysqld_safe --defaults-file="/etc/mysql5.7/my.cnf" --datadir="$datadir"
在该文件中找到以下两个参数,设置如下,其中datadir直接复用原mysql5.1的数据目录:1
2basedir=/usr/local/mysql5.7
datadir=/data/mysql
找到以下段落,设置datadir为正确的值:1
2
3
4
5
6
7
8
9
10if test -z "$basedir"
then
basedir=/usr/local/mysql5.7
bindir=/usr/local/mysql5.7/bin
if test -z "$datadir"
then
datadir=/data/mysql
fi
sbindir=/usr/local/mysql5.7/bin
libexecdir=/usr/local/mysql5.7/bin
2.4启动mysql5.7
先清空之前的错误日志,便于观察:echo “” > /var/log/mysqld.log
启动数据库: /etc/init.d/mysqld start
观察错误日志输出信息,会看到因为数据目录中不存在5.7版本的管理信息而产生的报错,但不会影响数据库启动。
2.5执行mysql_upgrade升级数据库版本1
/usr/local/mysql5.7/bin/mysql_upgrade -u root -p
执行后会显示mysql对全部库表执行了一次检查和修复、升级,升级正常则不会有报错信息。
重启数据库以使上面的升级结果生效:1
2/etc/init.d/mysqld stop
/etc/init.d/mysqld start
按以下步骤检查:
登录mysql检查下是否增加了一个performance_schema的库;
进入名为mysql的库,检查是否新增了innodb_index_stats,innodb_table_stats,proxies_priv,slave_master_info,slave_relay_log_info,slave_worker_info 这6张表;
检查mysql.user表,是否新增了Create_tablespace_priv,plugin,authentication_string,password_expired这4个字段;
检查业务上使用的数据库表、数据是否正常;
再观察mysql的错误日志输出信息;
mysql_upgrade命令做了些什么工作:
mysql_upgrade examines all tables in all databases for incompatibilities with the current version of MySQL.
mysql_upgrade also upgrades themysql system database so that you can take advantage of new privileges or capabilities.
2.6配置环境变量
编辑/etc/profile文件,在PATH变量中增加以下信息:1
2
3
4
5vi /etc/profile
PATH=/usr/local/mysql5.7/bin:$PATH
export PATH
source /etc/profile
运行mysql -V看显示的版本信息是不是5.7 。登录下数据库看是否正常。
至此,版本升级工作全部结束。
业务应用在使用升级后的数据库时,未发现存在读写或其它问题。
基于新升级后的数据库,成功得配置了与mysql master的主从复制关系。
升级原因
1.业务中使用中文表情,mysql5.1不支持utf8mb4,只能升级5.6+
2.
mysql出现错误Can’t initialize character set utf8
#在/usr/share/mysql/charsets/Index.xml添加复制utf8改成utf8mb41
2
3
4
5
6
7
8
9
10
11
12
13<charset name="utf8mb4">
<family>Unicode</family>
<description>UTF-8 Unicode</description>
<alias>utf-8</alias>
<collation name="utf8_general_ci" id="33">
<flag>primary</flag>
<flag>compiled</flag>
</collation>
<collation name="utf8_bin" id="83">
<flag>binary</flag>
<flag>compiled</flag>
</collation>
</charset>
#修改/etc/mysql5.7/my.cnf编码为utf8mb41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
port=3306
user=mysql
character-sets-dir =/usr/share/mysql/charsets/
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
log_timestamps=SYSTEM
explicit_defaults_for_timestamp=true
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Recommended in standard MySQL setup
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[mysqld_safe]
log-error=/var/log/mysqld5.7.log
pid-file=/var/run/mysqld/mysqld5.7.pid
#socket=/var/lib/mysql/mysql5.7.sock
[client]
default-character-set = utf8mb4
socket=/var/lib/mysql/mysql.sock
[mysql]
default-character-set = utf8mb4
#socket=/var/lib/mysql/mysql5.7.sock
修改完不能重启mysql,重启navicat就连不上mysql
3.在业务代码连接mysql使用utf8mb4
#修改django项目setting.py1
2
3
4
5
6
7
8
9
10
11
12
13DATABASES = {
'default': {
#'ENGINE': 'django.db.backends.sqlite3',
#'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE': 'django.db.backends.mysql',
'NAME': 'outing_store',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': 3306,
'OPTIONS': {'charset':'utf8mb4'},
},
}
#修改要是用了sqlalchemy,需要修改连接器对象1
2
3
4vi applib/mode/modules.py
Base = declarative_base()
engine = create_engine('mysql://root:123456@0.0.0.0/outing_data?charset=utf8mb4',pool_size=50, pool_recycle=3600, echo=False)
Session = sessionmaker(bind=engine)
mysql相关命令
1 | ALTER DATABASE `database` DEFAULT CHARACTER SET utf8mb4; |