Ubuntu22.04安装mysql
# Ubuntu22.04安装mysql
# Ubuntu22.04安装mysql8
download:https://dev.mysql.com/downloads/file/?id=542926
# 1.准备环境
sudo -i
sudo apt update
sudo apt install libncurses5 libaio1 libtinfo5 -y
2
3
# 2.解压mysql文件
mkdir -p /home/mysql/temp
chown -R zhou:zhou /home/mysql/temp
tar -xvf mysql-server_8.4.6-1ubuntu22.04_amd64.deb-bundle.tar
2
3
# 3.卸载原有的mysql(如果有)
sudo systemctl stop mysql
sudo apt purge mysql-server mysql-client mysql-common mysql-server-core-* mysql-client-core-* -y
sudo rm -rf /etc/mysql /var/lib/mysql /var/log/mysql
sudo apt autoremove -y
2
3
4
# 4.安装deb包
wget http://archive.ubuntu.com/ubuntu/pool/universe/m/mecab/libmecab2_0.996-1.2ubuntu1_amd64.deb
sudo dpkg -i mysql-common_8.4.6-1ubuntu22.04_amd64.deb
sudo dpkg -i mysql-community-client-plugins_8.4.6-1ubuntu22.04_amd64.deb
sudo dpkg -i mysql-community-client-core_8.4.6-1ubuntu22.04_amd64.deb
sudo dpkg -i mysql-community-client_8.4.6-1ubuntu22.04_amd64.deb
sudo dpkg -i mysql-client_8.4.6-1ubuntu22.04_amd64.deb
sudo dpkg -i libmecab2_0.996-1.2ubuntu1_amd64.deb
sudo dpkg -i mysql-community-server-core_8.4.6-1ubuntu22.04_amd64.deb
sudo dpkg -i mysql-community-server_8.4.6-1ubuntu22.04_amd64.deb
sudo dpkg -i mysql-server_8.4.6-1ubuntu22.04_amd64.deb
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
问题1:安装mysql-community-server-core时缺少依赖:libmecab2
处理1:
wget http://archive.ubuntu.com/ubuntu/pool/universe/m/mecab/libmecab2_0.996-1.2ubuntu1_amd64.deb
sudo dpkg -i libmecab2_0.996-1.2ubuntu1_amd64.deb
2
# 5.修改数据目录到 /home/mysql/data
停止mysql:
sudo systemctl stop mysql
创建目标目录并赋权限:
sudo mkdir -p /home/mysql/data
sudo mkdir -p /home/mysql/log
sudo touch /home/mysql/log/error.log
sudo chown -R mysql:mysql /home/mysql
2
3
4
修改配置文件:
配置文件路径一般是 /etc/mysql/mysql.conf.d/mysqld.cnf 或 /etc/my.cnf
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
---
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /home/mysql/data
log-error = /home/mysql/log/error.log
---
2
3
4
5
6
7
8
# 6.将原始数据库文件迁移(如果已经生成)
sudo mv /var/lib/mysql/* /home/mysql/data/
sudo chown -R mysql:mysql /home/mysql
sudo chmod -R 755 /home/mysql
2
3
# 7.初始化数据库(如果是新安装)
如果你没有迁移旧的 /var/lib/mysql,你需要初始化数据目录:
sudo mysqld --initialize --user=mysql --datadir=/home/mysql/data
这将自动生成一个随机 root 密码,系统日志中可找到:
sudo grep 'temporary password' /home/mysql/log/error.log
# 8.重启服务并测试
sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld
sudo systemctl start mysql
sudo systemctl enable mysql
sudo mysql -u root -p
2
3
4
5
6
验证数据目录位置:
mysql -u root -p -e "SHOW VARIABLES LIKE 'datadir';"
登录后修改当前用户密码:
ALTER USER USER() IDENTIFIED BY '123456';
# 9.设置mysql8数据库密码永不过期
SET PERSIST default_password_lifetime = 0;
SET GLOBAL default_password_lifetime = 0;
2
# Ubuntu22.04安装mysql5
download:https://downloads.mysql.com/archives/get/p/23/file/mysql-server_5.7.36-1ubuntu18.04_amd64.deb-bundle.tar
# 1.准备环境
sudo -i
sudo apt-get install ./libmysql*
sudo apt-get install libtinfo5
2
3
# 2.解压mysql文件
mkdir -p /home/mysql/temp
chown -R zhou:zhou /home/mysql/temp
tar -xvf mysql-server_5.7.36-1ubuntu18.04_amd64.deb-bundle.tar
2
3
# 3.卸载原有的mysql(如果有)
同上
# 4.安装deb包
sudo apt-get install ./mysql-community-client_5.7.36-1ubuntu18.04_amd64.deb
sudo apt-get install ./mysql-client_5.7.36-1ubuntu18.04_amd64.deb
sudo apt-get install ./mysql-community-server_5.7.36-1ubuntu18.04_amd64.deb
sudo apt-get install ./mysql-server_5.7.36-1ubuntu18.04_amd64.deb
2
3
4
# 5.修改数据目录到 /home/mysql/data
同上
# 6.将原始数据库文件迁移(如果已经生成)
同上
# 7.初始化数据库(如果是新安装)
同上
# 8.重启服务并测试
同上
# 数据迁移
目的是从mysql5整体备份数据迁移到mysql8,看看有没有什么问题
# 脚本迁移
# 1.数据准备
下载测试数据:https://github.com/datacharmer/test_db
# 2.导入数据到mysql5
mysql -t <employees.sql -u root -p
use employees;
show tables;
2
# 3.在mysql5主机上创建数据迁移脚本
执行迁移脚本前,需要准备mysql迁移账号,我这里直接使用root账号,迁移完就删除
查看root是否允许远程登录,如果不允许就创建用户:
SELECT user, host FROM mysql.user WHERE user='root';
# 发现60和61root都不能远程登录,在60和61机器都执行,由于都是从61主机进行远程登录,这里就设置为61
CREATE USER 'root'@'10.0.0.61' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.0.0.61' WITH GRANT OPTION;
FLUSH PRIVILEGES;
2
3
4
假设:
- 主机1(MySQL 5.6):10.0.0.60,root/123456
- 主机2(MySQL 8.4):10.0.0.61,root/123456
vim mysql_migrate_with_users.sh
---
#!/bin/bash
# 只迁移MySQL业务库数据(不迁移用户权限)
# ===== 配置区 =====
SRC_HOST="10.0.0.61" # 源MySQL 5.6 IP
SRC_PORT=3306 # 源端口
SRC_USER="root" # 源用户名
SRC_PASS="123456" # 源密码
DST_HOST="10.0.0.60" # 目标MySQL 8.4 IP
DST_PORT=3306 # 目标端口
DST_USER="root" # 目标用户名
DST_PASS="123456" # 目标密码
DST_SSH_USER="zhou" # 目标服务器登录用户(非root)
# ==================
BACKUP_FILE="/tmp/mysql_migrate_$(date +%F_%H%M%S).sql"
echo "=== 1. 获取业务数据库列表(排除系统库) ==="
DATABASES=$(mysql -h "$SRC_HOST" -P "$SRC_PORT" -u "$SRC_USER" -p"$SRC_PASS" -N -e "SHOW DATABASES;" | grep -Ev "^(mysql|performance_schema|information_schema|sys)$")
if [ -z "$DATABASES" ]; then
echo "❌ 没有业务数据库可导出"
exit 1
fi
echo "业务数据库:$DATABASES"
echo "=== 2. 导出业务数据库 ==="
mysqldump -h "$SRC_HOST" -P "$SRC_PORT" -u "$SRC_USER" -p"$SRC_PASS" \
--databases $DATABASES \
--single-transaction \
--routines \
--triggers \
--events \
--hex-blob \
> "$BACKUP_FILE"
if [ $? -ne 0 ]; then
echo "❌ 数据导出失败!"
exit 1
fi
echo "✅ 数据导出完成:$BACKUP_FILE"
echo "=== 3. 传输备份文件到目标服务器 ==="
scp "$BACKUP_FILE" "$DST_SSH_USER@$DST_HOST:/tmp/"
if [ $? -ne 0 ]; then
echo "❌ 文件传输失败!"
exit 1
fi
echo "=== 4. 在目标服务器导入数据库 ==="
ssh -t "$DST_SSH_USER@$DST_HOST" "sudo -i mysql -P $DST_PORT -u \"$DST_USER\" -p\"$DST_PASS\" < /tmp/$(basename $BACKUP_FILE)"
if [ $? -ne 0 ]; then
echo "❌ 数据导入失败!"
exit 1
fi
echo "✅ 数据库迁移完成!"
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
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
chmod +x mysql_migrate_with_users.sh
./mysql_migrate_with_users.sh
2
# 手动迁移
# 1.查看有哪些业务库
mysql -u root -p -e "SHOW DATABASES;"
# 2.执行 mysqldump 导出(排除系统库)
mysqldump -u root -p \
--databases db1 db2 db3 db4 db5 db6 db7 db8 db9 db10 employees \
--single-transaction --quick --routines --events --triggers \
> /tmp/mysql_all_databases.sql
2
3
4
# 3.通过SCP传到主机2
scp /tmp/mysql_all_databases.sql root@10.0.0.60:/tmp/
# 4.在主机2上导入
mysql -u root -p < /tmp/mysql_all_databases.sql
手动导入用户并授权,例如:
CREATE USER 'username'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON db1.* TO 'username'@'%';
FLUSH PRIVILEGES;
2
3
实例:
CREATE USER IF NOT EXISTS 'zhou'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON db1.* TO 'zhou'@'%';
GRANT ALL PRIVILEGES ON db2.* TO 'zhou'@'%';
GRANT ALL PRIVILEGES ON db3.* TO 'zhou'@'%';
GRANT ALL PRIVILEGES ON db4.* TO 'zhou'@'%';
GRANT ALL PRIVILEGES ON db5.* TO 'zhou'@'%';
......
FLUSH PRIVILEGES;
2
3
4
5
6
7
8
9
10
# 5.验证数据
mysql -u root -p -e "SHOW DATABASES;"
mysql -u root -p -e "SELECT COUNT(*) FROM db1.某个表;"
2
# 6.注意事项
字符集
MySQL 8 默认 utf8mb4,如果 MySQL 5.6 是 utf8,导入时可能会有字符集警告,可以在导出时加:--default-character-set=utf8
SQL_MODE
MySQL 8.4 默认 STRICT_TRANS_TABLES 等更严格,可能会导致部分旧数据导入失败,可以先调整:SET GLOBAL sql_mode='';
导入完成后再恢复默认,SET GLOBAL sql_mode = @@SESSION.sql_mode;