背景:由于项目比较老,用的数据库版本也是相当低,现在业务需求需要做数据同步,使用FlinkCDC的时候报数据库版本低,查询FlinkCDC要求的最低版本后果断升级mysql~
FlinkCDC对mysql最低版要求如下图:
(从 2.2 版本开始, MySQL CDC 支持了 MySQL 5.6 版本,满足低版本的 MySQL 用户需求。)
接下来我们就对数据库的升级做好准备:
数据库升级带来的风险:
1. 不兼容的更改:MySQL 5.7.37引入了一些不兼容的更改,可能会影响到现有的应用程序。例如,MySQL 5.7.37默认使用了更严格的SQL模式,这可能会导致一些应用程序无法正常工作。要避免这个问题,可以在升级之前仔细阅读MySQL 5.7.37的发行说明,并检查应用程序是否与新版本兼容。
2. 配置文件更改:MySQL 5.7.37的配置文件可能与旧版本不同,需要进行相应的更改。要避免这个问题,可以在升级之前备份旧的配置文件,并在升级后将其与新的配置文件进行比较,以确定是否需要进行更改。
3. 数据库引擎更改:MySQL 5.7.37默认使用了InnoDB作为默认的存储引擎,而旧版本可能使用了MyISAM或其他存储引擎。要避免这个问题,可以在升级之前检查现有的数据库使用的存储引擎,并在升级后将其更改为InnoDB。
4. 安全设置更改:MySQL 5.7.37引入了一些新的安全设置,例如密码策略和加密功能。要避免这个问题,可以在升级之前仔细阅读MySQL 5.7.37的发行说明,并根据需要进行相应的更改。
为了避免这些问题,可以尝试按照以下步骤进行操作:
1. 在升级之前备份MySQL的数据和配置文件,以防止升级过程中出现意外情况导致数据丢失。
2. 仔细阅读MySQL 5.7.37的发行说明,并检查应用程序是否与新版本兼容。
3. 检查现有的数据库使用的存储引擎,并在升级后将其更改为InnoDB。
4. 在升级之前备份旧的配置文件,并在升级后将其与新的配置文件进行比较,以确定是否需要进行更改。
5. 仔细阅读MySQL 5.7.37的发行说明,并根据需要进行相应的安全设置更改。
总之,在升级MySQL之前,一定要做好充分的准备工作,以确保升级过程顺利,并且不会影响到现有的应用程序和数据。
MySQL查看默认存储引擎:SHOW VARIABLES LIKE 'default_storage_engine%';
一、环境准备(可选):
要在Linux上安装yum,可以按照以下步骤进行操作:
1. 确认系统是否已经安装了yum。可以使用以下命令检查:
yum --version
如果系统已经安装了yum,则应该输出yum的版本信息。如果系统没有安装yum,则应该输出-bash: yum: command not found。
2. 如果系统没有安装yum,则可以使用以下命令安装:
sudo yum install yum-utils
这将安装yum及其相关工具。
3. 安装完成后,可以使用以下命令检查yum是否安装成功:
yum --version
如果yum已经成功安装,则应该输出yum的版本信息。
二、备份数据库所有数据:
要在Linux上将MySQL升级到5.7.37版本,可以按照以下步骤进行操作:
1. 备份MySQL的数据和配置文件,以防止升级过程中出现意外情况导致数据丢失。可以使用以下命令备份:
mysqldump -u root -p --all-databases > all_databases.sql
这将备份所有数据库到名为all_databases.sql的文件中。
要在Linux上查询all_databases.sql文件的位置,可以使用以下命令:
sudo find / -name all_databases.sql
将备份的数据和配置文件还原到新版本的MySQL中。可以使用以下命令还原:
mysql -u root -p < all_databases.sql
2.停止MySQL服务,并确保所有MySQL进程已经终止。可以使用以下命令停止MySQL服务
sudo systemctl stop mysql
要查询MySQL的安装目录,可以使用以下命令:
which mysql
查询mysql所有文件夹
find / -name mysql
删除文件夹
rm -rf /usr/lib64/mysql
3.下载对应版本压缩包
下载地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads
点击download进入以下页面:
https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz
操作步骤:
3.1在linux运行下载速度比较快(一般放在专门存放下载文件目录):https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz
3.2然后解压文件:tar -xvf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz,重新命名文件夹名称为mysql5.7.37.
3.3把解压的文件截切到/usr/local/mysql5.7.37文件目录下(养成习惯把安装程序都按一定规则存放):mv mysql-5.7.37-linux-glibc2.12-x86_64 /usr/local/mysql5.7.37/
3.4创建mysql用户组和用户并修改权限
groupadd mysql
useradd -r -g mysql mysql
3.5创建数据目录并赋予权限
mkdir -p /data/mysql #创建目录
chown mysql:mysql -R /data/mysql #赋予权限
3.6配置my.cnf(最好在外部先以UTF-8格式编辑好传到服务器)
vim /etc/my.cnf
内容如下:(注意空格)
[mysqld]
bind-address=0.0.0.0
port=3306
user=mysql
basedir=/usr/local/mysql5.7.37 #这里特别注意把mysql-5.7.37写成mysql会导致后面无法启动
datadir=/data/mysql
socket=/tmp/mysql.sock
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pid
#character config
character_set_server=utf8mb4
symbolic-links=0
explicit_defaults_for_timestamp=true
lower_case_table_names=1 #不区分表名大小写,统一换成小写
sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'
log-bin=mysql-bin #开启binlog日志,不开启则不需要写以下三行
server-id=12
binlog_format=ROW
expire_logs_days=7 #清除binlog周期,天
3.7初始化数据库
进入mysql的bin目录:cd /usr/local/mysql5.7.37/bin/
初始化:./mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql5.7.37/ --datadir=/data/mysql/ --user=mysql --initialize
查看密码:cat /data/mysql/mysql.err
3.8检查MySQL数据目录是否存在。可以使用以下命令检查MySQL数据目录是否存在:
ls /data/mysql
如果MySQL数据目录不存在,则可以使用以下命令创建:
mkdir /data/mysql
chown mysql:mysql /data/mysql
3.9检查MySQL数据目录的权限。可以使用以下命令检查MySQL数据目录的权限:
ls -ld /data/mysql
如果MySQL数据目录的权限不正确,则可以使用以下命令更改权限:
chmod 755 /data/mysql
3.10启动mysql,并更改root 密码
先将mysql.server放置到/etc/init.d/mysql中
cp /usr/local/mysql5.7.37/support-files/mysql.server /etc/init.d/mysql
3.11启动!!!
service mysql start
ps -ef|grep mysql
到这里说明mysql已经安装成功了!!
3.12下面修改密码:
首先登录mysql,前面的那个是随机生成的。
./mysql -u root -p #bin目录下
再执行下面三步操作,然后重新登录。
SET PASSWORD = PASSWORD('EnCanadaForEMC');
ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
FLUSH PRIVILEGES;
3.13查看mysql版本:
三、必要操作
1.这个时候如果无法连接:
修改mysql的PATH环境变量bin的安装地址
1.1要修改MySQL的PATH环境变量中bin的安装地址,可以按照以下步骤进行操作:
确认MySQL的安装路径。可以使用以下命令检查MySQL的安装路径:
which mysql
这将显示MySQL的安装路径,例如/usr/local/mysql5.7.37/bin/mysql
1.2打开~/.bashrc文件。可以使用以下命令打开~/.bashrc文件:
nano ~/.bashrc
1.3在文件末尾添加以下行:
export PATH=$PATH:/path/to/mysql/bin
其中,/path/to/mysql/bin应替换为MySQL的安装路径中bin目录的路径,例如/usr/local/mysql5.7.37/bin/mysql/bin。
1.4保存并关闭文件。可以使用Ctrl+X、Y和Enter键保存并关闭文件。
1.5使更改生效。可以使用以下命令使更改生效:
source ~/.bashrc
1.6确认PATH环境变量已经更新。可以使用以下命令检查PATH环境变量是否已经更新:
echo $PATH
这将显示PATH环境变量的当前值,其中应该包含MySQL的安装路径中bin目录的路径。
2.这时候你如果使用远程连接……你会发现你无法连接。
2.1这里主要执行下面三个命令(先登录数据库)
use mysql #访问mysql库
update user set host = '%' where user = 'root'; #使root能再任何host访问
FLUSH PRIVILEGES; #刷新
注意:可以将mysql设置成(不区分大小写)
vim /etc/my.cnf
在这个配置文件下添加这个参数(不区分大小写)
lower_case_table_names = 1
2.2全局使用mysql命令
-bash: mysql: command not found #mysql命令没有找到
mysql命令没有找到,找到mysql安装目录,which mysql,也可以在上述目录查 /usr/local查找是否有mysql ,然后建立到 /usr/bin/的软链
ln -s /usr/local/mysql55/bin/mysql /usr/bin/
因为系统默认会查找/usr/bin下的命令,所以要连接到这个目录
/usr/local/mysql5.7.37/bin/mysql 是mysql的安装目录
/usr/bin/ 是软链接到的目录
3.设置开启mysql的二进制日志文件binlog。
如果要使用Flinkcdc同步MySQL,建议将二进制日志(binlog)的格式设置为ROW。这是因为ROW格式可以更准确地记录每个修改操作的行数据,从而可以更准确地重放修改操作。而且,Flinkcdc默认使用ROW格式进行数据同步,如果MySQL的二进制日志格式不是ROW,可能会导致数据同步的问题。
使用命令
SHOW VARIABLES LIKE 'log_bin';
确认MySQL是否已经启用了二进制日志。
解决方法:
要将MySQL的二进制日志格式设置为ROW,可以按照以下步骤进行操作:
1. 编辑MySQL的配置文件。可以使用以下命令编辑MySQL的配置文件:
sudo vi /etc/my.cnf
如果MySQL的配置文件不存在,则可以使用以下命令创建:
sudo cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
2. 在MySQL的配置文件中添加以下内容:
[mysqld]
log-bin=mysql-bin
server-id=1
binlog_format=ROW
这将启用MySQL的二进制日志,并将二进制日志文件的前缀设置为mysql,将MySQL服务器的ID设置为1,并将二进制日志格式设置为ROW。
3. 重新启动MySQL服务。可以使用以下命令重新启动MySQL服务:
sudo systemctl restart mysqld
4. 确认MySQL已经启用了二进制日志,并且二进制日志格式为ROW。可以使用以下命令登录MySQL并执行SHOW VARIABLES LIKE 'log_bin';和SHOW VARIABLES LIKE 'binlog_format';命令:
mysql -u root -p
SHOW VARIABLES LIKE 'log_bin';
SHOW VARIABLES LIKE 'binlog_format';
如果输出的结果中Value列的值为ON,则表示MySQL已经启用了二进制日志,并且二进制日志格式为ROW。
5.设置mysql的binlog文件保存过期时间:
在MySQL的配置文件中添加以下内容:
[mysqld]
log-bin=mysql-bin
server-id=1
expire_logs_days=7 #清除binlog周期,天
四、数据库操作
1.增加数据库mysql下usr表用户:参见用户表新增sql文件
2.导出的sql文件需要去除mysql、information_schema、performance_schema三个数据库。
五、注意事项
使用sudo systemctl 会报错,但是使用service mysql start不报错:
例如: sudo systemctl status mysqld
如图:
实际数据库已经启动:
六、问题:
问题1:
mysql -u root -p
-bash: mysql: 未找到命令
解决方法:
确认MySQL的安装路径是否在系统的PATH环境变量中。可以使用以下命令检查系统的PATH环境变量:
如果MySQL的安装路径不在系统的PATH环境变量中,则可以使用以下命令将其添加到PATH环境变量中:
export PATH=$PATH:/path/to/mysql/bin
其中,/path/to/mysql/bin应替换为MySQL的安装路径。
3. 如果MySQL已经安装并且其安装路径已经在系统的PATH环境变量中,则可以尝试重新安装MySQL客户端。可以使用以下命令重新安装MySQL客户端:
sudo yum reinstall mysql
问题2:
Starting MySQL.... ERROR! The server quit without updating PID file (/data/mysql/mysql.pid).
解决方法:
这个错误提示表明在启动MySQL服务时出现了问题,导致MySQL服务器无法更新PID文件。要解决这个问题,可以按照以下步骤进行操作:
- 检查MySQL配置文件。可以使用以下命令检查MySQL配置文件是否存在:
ls /etc/my.cnf
如果MySQL配置文件不存在,则可以使用以下命令创建:
sudo cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
- 检查MySQL数据目录的权限。可以使用以下命令检查MySQL数据目录的权限:
ls -ld /data/mysql
如果MySQL数据目录的权限不正确,则可以使用以下命令更改权限:
chmod 755 /data/mysql
- 检查MySQL数据目录是否存在。可以使用以下命令检查MySQL数据目录是否存在:
ls /data/mysql
如果MySQL数据目录不存在,则可以使用以下命令创建:
mkdir /data/mysql
chown mysql:mysql /data/mysql
- 启动MySQL服务。可以使用以下命令启动MySQL服务:
service mysql start
- 确认MySQL服务已经启动。可以使用以下命令检查MySQL服务是否已经启动:
ps -ef|grep mysql
systemctl status mysqld
如果MySQL服务已经启动,则应该输出active (running)。
问题3:
Failed to start MariaDB 10.3.18 database server. #MariaDB启动失败
解决方法:
如果在启动MariaDB 10.3.18数据库服务器时出现了错误,可以按照以下步骤进行操作:
1. 检查MariaDB的日志文件。可以使用以下命令检查MariaDB的日志文件:
sudo tail -f /var/log/mariadb/mariadb.log
这将显示MariaDB的日志文件的最后几行。如果有任何错误或警告消息,则应该在日志文件中显示。
2. 检查MariaDB的配置文件。可以使用以下命令检查MariaDB的配置文件是否存在:
ls /etc/my.cnf.d/server.cnf
如果MariaDB的配置文件不存在,则可以使用以下命令创建:
sudo cp /usr/share/mysql/my-medium.cnf /etc/my.cnf.d/server.cnf
3. 检查MariaDB数据目录的权限。可以使用以下命令检查MariaDB数据目录的权限:
ls -ld /var/lib/mysql
如果MariaDB数据目录的权限不正确,则可以使用以下命令更改权限:
sudo chmod 755 /var/lib/mysql
4. 检查MariaDB数据目录是否存在。可以使用以下命令检查MariaDB数据目录是否存在:
ls /var/lib/mysql
如果MariaDB数据目录不存在,则可以使用以下命令创建:
sudo mkdir /var/lib/mysql
sudo chown mysql:mysql /var/lib/mysql
5. 启动MariaDB服务。可以使用以下命令启动MariaDB服务:
sudo systemctl start mariadb
6. 确认MariaDB服务已经启动。可以使用以下命令检查MariaDB服务是否已经启动:
ps -ef|grep mariadb
如果MariaDB服务已经启动,则应该输出active (running)。
总之,要解决Failed to start MariaDB 10.3.18 database server错误提示,需要检查MariaDB的日志文件、配置文件、数据目录的权限和是否存在、MariaDB服务是否已经启动,并进行必要的更改。如果MariaDB的配置文件不存在,则需要创建。如果MariaDB数据目录的权限不正确,则需要更改权限。如果MariaDB数据目录不存在,则需要创建。如果MariaDB服务没有启动,则需要启动MariaDB服务。
问题4:
在执行SQL查询时出现了语法错误,具体原因是ORDER BY子句中的列不在GROUP BY子句中,且该列不是函数依赖于GROUP BY子句中的列,这与MySQL的sql_mode=only_full_group_by不兼容。
解决方法:
1.查询原有的sql_mode配置:
在Navicat上或服务器连接mysql以后:select @@global.sql_mode
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
2.修改数据库配置(永久生效)
修改配置文件my.cnf (路径:/etc/my.cnf)
在[mysqld]模块下新增一行配置:
sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'
运行后重启,即可生效
知识点:
binlog_format=ROW是MySQL的一个配置选项,用于指定二进制日志(binlog)的格式。当binlog_format设置为ROW时,MySQL会将每个修改操作的行数据记录到二进制日志中,而不是记录SQL语句。这意味着在进行数据恢复或复制时,可以更准确地重放修改操作,因为每个修改操作的行数据都已经记录在二进制日志中。
具体来说,当binlog_format设置为ROW时,MySQL会将每个修改操作的行数据记录到二进制日志中,包括修改前和修改后的行数据。这样,在进行数据恢复或复制时,可以使用这些行数据来重建修改操作,而不是使用SQL语句。这种方式可以更准确地重放修改操作,因为它可以避免由于SQL语句的不同而导致的数据不一致问题。
二进制日志(binlog)的格式有哪些?
MySQL支持三种二进制日志(binlog)的格式,分别是STATEMENT、ROW和MIXED。这些格式可以通过binlog_format配置选项进行指定。
1. STATEMENT格式
STATEMENT格式是MySQL的默认二进制日志格式。当binlog_format设置为STATEMENT时,MySQL会将每个修改操作的SQL语句记录到二进制日志中。这意味着在进行数据恢复或复制时,可以使用这些SQL语句来重建修改操作。
但是,STATEMENT格式存在一些限制。例如,当使用非确定性函数(如NOW())或随机数函数(如RAND())时,可能会导致在主从复制中数据不一致的问题。此外,当使用存储过程或触发器时,也可能会导致数据不一致的问题。
2. ROW格式
当binlog_format设置为ROW时,MySQL会将每个修改操作的行数据记录到二进制日志中,而不是记录SQL语句。这意味着在进行数据恢复或复制时,可以更准确地重放修改操作,因为每个修改操作的行数据都已经记录在二进制日志中。
但是,ROW格式可能会导致二进制日志文件变得非常大,因为它需要记录每个修改操作的行数据。此外,当修改操作涉及到大量行数据时,也可能会导致性能问题。
3. MIXED格式
MIXED格式是STATEMENT和ROW格式的混合。当binlog_format设置为MIXED时,MySQL会根据具体情况选择使用STATEMENT格式或ROW格式。例如,对于简单的修改操作,MySQL可能会选择使用STATEMENT格式,而对于复杂的修改操作,MySQL可能会选择使用ROW格式。
MIXED格式可以兼顾STATEMENT和ROW格式的优点,但也存在一些限制。例如,当使用非确定性函数或随机数函数时,可能会导致在主从复制中数据不一致的问题。
总之,MySQL支持三种二进制日志的格式,分别是STATEMENT、ROW和MIXED。这些格式可以通过binlog_format配置选项进行指定。STATEMENT格式记录SQL语句,ROW格式记录行数据,MIXED格式是STATEMENT和ROW格式的混合。在选择二进制日志格式时,需要根据具体情况进行权衡和选择。