mysql支持中文表情5.1升级5.7教程

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/src

1
2
cd /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
12
cmake \
-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
6
chown -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
2
cd /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
3
mkdir -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服务管理脚本mysqld

1
2
mv  /etc/init.d/mysqld5.7  /etc/init.d/mysqld  
vi /etc/init.d/mysqld

首先将以下两行参数,第一行设为/etc/my.cnf,第二行直接把–defaults-file部分删除。

1
2
conf=/etc/mysql5.7/my.cnf  
$bindir/mysqld_safe --defaults-file="/etc/mysql5.7/my.cnf" --datadir="$datadir"

在该文件中找到以下两个参数,设置如下,其中datadir直接复用原mysql5.1的数据目录:

1
2
basedir=/usr/local/mysql5.7  
datadir=/data/mysql

找到以下段落,设置datadir为正确的值:

1
2
3
4
5
6
7
8
9
10
if 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
5
vi /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改成utf8mb4

1
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编码为utf8mb4

1
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
30
datadir=/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.py

1
2
3
4
5
6
7
8
9
10
11
12
13
DATABASES = {
'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
4
vi 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
2
3
4
5
6
7
8
9
10
ALTER DATABASE `database` DEFAULT CHARACTER SET utf8mb4;
ALTER TABLE `table` DEFAULT CHARACTER SET utf8mb4;
alter table `table_name` convert to character set utf8mb4;
echo "" > /var/log/mysqld5.7.log
show variables like "char%"

#解压:
tar zxvf FileName.tar.gz
#压缩:
tar zcvf FileName.tar.gz DirName

热评文章