欢迎光临
我们一直在努力

MySQL笔记

      

CentOS 7 手动安装 MySQL 5.6.38 笔记

环境说明

  • 操作系统:CentOS 7

  • MySQL 版本:5.6.38(二进制包)

  • 安装位置:/opt/mysql

  • 安装方式:手动初始化,非 yum/rpm 安装

1. 检查系统是否已安装 MySQL

# 检查命令是否存在
mysql –version

# 检查服务状态
systemctl status mysql

# 检查 RPM 包
rpm -qa | grep mysql

结论:系统未安装 MySQL 服务。

2. 发现已存在的 MySQL 二进制包

cd /opt
ll

输出包含:

  • mysql-5.6.38-linux-glibc2.12-x86_64.tar.gz(安装包)

  • mysql目录(已解压)

说明:二进制包已解压,但未完成初始化和服务配置。

3. 准备 MySQL 运行用户与目录权限

# 创建 mysql 用户(如果不存在)
useradd mysql

# 进入 MySQL 目录
cd /opt/mysql

# 修正目录所有权(递归)
chown -R mysql:mysql /opt/mysql

⚠️ 注意:chown -R mysql:mysql /opt/mysql会将所有文件属主改为 mysql,包括 bin 下的可执行文件。生产环境可更精细地控制,但实验环境无影响。

4. 编写配置文件 /opt/mysql/my.cnf

[client]
default-character-set=utf8
socket=/tmp/mysql.sock

[mysql]
default-character-set=utf8

[mysqld]
socket=/tmp/mysql.sock
basedir=/opt/mysql
datadir=/opt/mysql/data
symbolic-links=0
character_set_server=utf8
lower_case_table_names=1
log-error=/opt/mysql/mysql-err.log
pid-file=/opt/mysql/mysqld.pid

[mysqld_safe]
log-error=/opt/mysql/mysql-err.log
pid-file=/opt/mysql/mysqld.pid

注意:[mysqld_safe]段不能有 default-character-set,否则启动警告。

5. 初始化数据库

cd /opt/mysql
scripts/mysql_install_db –user=mysql –defaults-file=/opt/mysql/my.cnf –basedir=/opt/mysql –datadir=/opt/mysql/data

初始化成功输出:

Installing MySQL system tables…OK
Filling help tables…OK

提示设置 root 密码及启动方法。

初始化后会在 /opt/mysql/data下生成系统数据库文件。

6. 准备日志文件并启动 MySQL

# 创建错误日志文件
touch /opt/mysql/mysql-err.log
chown mysql:mysql /opt/mysql/mysql-err.log

# 手动启动
/opt/mysql/bin/mysqld_safe –defaults-file=/opt/mysql/my.cnf –user=mysql &

# 验证启动
ps aux | grep mysqld
/opt/mysql/bin/mysql -u root   # 初始无密码,可直接登录

7. 设置 root 密码

/opt/mysql/bin/mysqladmin -u root password '123'

⚠️ 警告:命令行明文密码不安全,仅实验环境使用。生产环境请用 mysql_secure_installation或交互式设置强密码。

测试登录:

/opt/mysql/bin/mysql -u root -p
# 输入密码: 123

mysql> SELECT VERSION();

8. 配置 systemd 开机自启

8.1 创建服务文件

vim /etc/systemd/system/mysql.service

内容如下:

[Unit]
Description=MySQL Server
After=network.target

[Service]
User=mysql
Group=mysql
Type=forking
ExecStart=/opt/mysql/bin/mysqld_safe –defaults-file=/opt/mysql/my.cnf –user=mysql
ExecStop=/opt/mysql/bin/mysqladmin -u root -p123 shutdown
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

注意:ExecStop中的密码需与实际 root 密码一致。如果后续修改密码,需同步更新此文件。

8.2 加载并启用服务

systemctl daemon-reload
systemctl enable mysql     # 设置开机自启
systemctl start mysql       # 立即启动(测试)
systemctl status mysql     # 查看状态,应显示 active (running)

8.3 验证自启

重启虚拟机后,执行 systemctl status mysql或尝试连接数据库,确认服务已自动运行。

9. 可选:将 MySQL 加入 PATH

echo 'export PATH=$PATH:/opt/mysql/bin' >> ~/.bashrc
source ~/.bashrc

之后可直接执行:

mysql -u root -p

10. 常见问题及解决

问题解决方法
mysql: command not found 未加入 PATH,使用全路径 /opt/mysql/bin/mysql或加入 PATH
mysqld_safe error: log-error set to … file don't exists touch /opt/mysql/mysql-err.log && chown mysql:mysql /opt/mysql/mysql-err.log
Unit mysql.service not found 未创建 systemd 服务文件,按第8步创建
启动失败,提示权限错误 确保 /opt/mysql/data及日志文件属主为 mysql:mysql
/etc/my.cnf冲突 备份并移除:mv /etc/my.cnf /etc/my.cnf.bak

重要提醒

  • 安全考虑:生产环境务必使用复杂密码,并运行 mysql_secure_installation进行安全加固

  • 数据备份:定期备份数据目录 /opt/mysql/data

  • 性能调优:根据服务器硬件配置调整 my.cnf中的参数

  • 防火墙:确保防火墙开放 3306 端口(如需要远程访问)

  • # 防火墙开放3306端口示例
    firewall-cmd –zone=public –add-port=3306/tcp –permanent
    firewall-cmd –reload

    本地连接 Linux 虚拟机 MySQL 完整笔记(含常见错误与解法)

    一、前提条件

    • Linux 虚拟机(如 CentOS)中已安装 MySQL。

    • 宿主机(Windows / macOS)与虚拟机之间网络互通(能互相 ping 通)。

    • 宿主机上已安装 MySQL 客户端(或使用 IDE 的数据库工具)。


    二、MySQL 服务端配置(必做项)

    1. 允许远程连接:修改绑定地址

    MySQL 默认只监听 127.0.0.1,禁止远程访问。

    配置文件:/etc/my.cnf 或 /opt/mysql/my.cnf(取决于安装位置)

    修改:在 [mysqld] 段添加或修改:

    ini

    bind-address = 0.0.0.0

    重启 MySQL:

    bash

    sudo systemctl restart mysql   # 或 mysqld

    验证:

    bash

    netstat -tulnp | grep 3306

    应显示 0.0.0.0:3306,而非 127.0.0.1:3306。

    2. 授权远程用户

    登录 MySQL:

    bash

    mysql -u root -p

    执行授权(以 root 为例,密码设为 123):

    sql

    — 方法1:创建或修改用户并授权
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
    FLUSH PRIVILEGES;

    注意:MySQL 5.6 中 GRANT … IDENTIFIED BY 可用,MySQL 8.0 需分开执行 CREATE USER 和 GRANT。

    验证用户是否存在:

    sql

    SELECT host, user FROM mysql.user WHERE user='root';

    MySQL 5.6 特别提醒:如果 authentication_string 为空,请检查 Password 列:

    sql

    SELECT host, user, Password FROM mysql.user WHERE user='root';

    若 Password 为空,需更新:

    sql

    UPDATE mysql.user SET Password = PASSWORD('123') WHERE user='root' AND host='%';
    FLUSH PRIVILEGES;

    3. 开放防火墙端口

    CentOS 7+ (firewalld):

    bash

    sudo firewall-cmd –zone=public –add-port=3306/tcp –permanent
    sudo firewall-cmd –reload

    Ubuntu (ufw):

    bash

    sudo ufw allow 3306/tcp

    旧版 iptables:

    bash

    sudo iptables -A INPUT -p tcp –dport 3306 -j ACCEPT
    sudo service iptables save

    4. 检查 SELinux(CentOS/RHEL)

    如果 SELinux 阻止 MySQL 端口,可临时关闭测试:

    bash

    sudo setenforce 0

    永久关闭需修改 /etc/selinux/config 中的 SELINUX=disabled。


    三、宿主机连接命令与易错点

    1. 正确连接命令

    bash

    mysql -h 虚拟机IP -u root -p密码

    示例:

    bash

    mysql -h 192.168.21.100 -u root -p123

    2. 常见错误及原因

    错误信息原因解决方法
    Can't connect to MySQL server on 'IP' (10060) 网络不通 / 防火墙阻止 / MySQL未监听0.0.0.0 检查 ping、防火墙、bind-address
    Can't connect to MySQL server on 'IP' (10061) MySQL 服务未启动 虚拟机内 systemctl start mysql
    Access denied for user 'root'@'你的主机名' (using password: YES) 密码错误 / 用户未授权 / 密码列空 重新授权并设置密码,检查 Password 列
    Access denied for user 'root'@'你的主机名' (using password: NO) 命令中 -p 后没有跟密码,且未交互输入 使用 -p密码(无空格)或 -p 后回车输入
    Authentication plugin 'caching_sha2_password' 相关错误 MySQL 8.0 默认插件与旧客户端不兼容 修改用户插件:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123';
    Host 'xxx' is not allowed to connect to this MySQL server 用户没有从该主机连接的权限 检查 mysql.user 中对应的 host 是否包含 '%' 或具体 IP
    mysql: command not found 宿主机未安装 MySQL 客户端 安装客户端(Windows 下载 MySQL,Linux yum install mysql)

    3. 命令格式易错点

    • ❌ mysql -h 192.168.21.100 -u root -p 123-p 和密码之间有空格 → MySQL 会把 123 当作数据库名,密码视为空。

    • ✅ mysql -h 192.168.21.100 -u root -p123或 mysql -h 192.168.21.100 -u root -p 回车后再输入密码。


    四、MySQL 5.6 版本特殊注意事项

    • 密码列:mysql.user 表中实际存储密码的是 Password 列,而非 authentication_string。后者在 5.6 中无用。

    • 查看密码:SELECT host, user, Password FROM mysql.user;

    • 设置密码:UPDATE mysql.user SET Password = PASSWORD('新密码') WHERE user='root' AND host='%'; FLUSH PRIVILEGES;

    • SET PASSWORD 命令:SET PASSWORD FOR 'root'@'%' = PASSWORD('123'); 也能工作(它会更新 Password 列),但有时不生效时请用 UPDATE。


    五、调试步骤(连接不上时按顺序检查)

  • 虚拟机能 ping 通吗?ping 192.168.21.100

  • MySQL 服务是否运行?systemctl status mysql

  • MySQL 是否监听 0.0.0.0?netstat -tulnp | grep 3306

  • 防火墙是否开放 3306?sudo firewall-cmd –list-ports

  • MySQL 用户授权是否正确?登录 MySQL 执行:SELECT host, user, Password FROM mysql.user WHERE user='root';确保 host='%' 的行有密码哈希。

  • 从虚拟机内部测试 TCP 连接mysql -h 127.0.0.1 -u root -p123 -e "SELECT 1"(如果失败,说明 MySQL 配置或权限有问题)

  • 从宿主机 telnet 测试端口telnet 192.168.21.100 3306如果连接成功会看到 MySQL 版本信息,否则网络/防火墙问题。

  • 检查 SELinuxgetenforce 若为 Enforcing,临时 setenforce 0 测试。


  • 六、完整成功案例(基于之前操作)

    虚拟机 (CentOS 7, MySQL 5.6 手动安装):

    • 路径:/opt/mysql

    • 配置文件:/opt/mysql/my.cnf 中设置 bind-address=0.0.0.0

    • 防火墙:开放 3306/tcp

    • MySQL 用户:

      sql

      UPDATE mysql.user SET Password = PASSWORD('123') WHERE user='root' AND host='%';
      FLUSH PRIVILEGES;

    宿主机 (Windows):

    • 命令:mysql -h 192.168.21.100 -u root -p123

    • 结果:成功进入 MySQL 命令行。


    七、总结口诀

    text

    ping 通服务开,绑定零全接。
    防火墙放行,授权密码在。
    MySQL 五和六,Password 列要查。
    命令 -p 不空格,远程连上来。

    按照以上笔记逐步排查,即可顺利从本地连接到 Linux 虚拟机中的 MySQL。

    MySQL 运维与优化教案

    本教案涵盖 MySQL 基础操作、索引优化、SQL 性能分析、视图与存储过程、锁机制、日志管理、主从复制及 MyCAT 读写分离。适合作为运维与开发人员的系统学习材料。


    一、数据库与表基础操作

    1.1 查看当前数据库

    sql

    SELECT DATABASE();

    1.2 创建数据库并切换

    sql

    CREATE DATABASE itheima;
    USE itheima;

    1.3 创建表(示例 tb_user)

    sql

    CREATE TABLE `tb_user` (
    `id` int NOT NULL COMMENT '编号',
    `name` varchar(20) NOT NULL COMMENT '姓名',
    `phone` varchar(11) DEFAULT NULL COMMENT '手机号',
    `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
    `profession` varchar(30) DEFAULT NULL COMMENT '专业',
    `age` int DEFAULT NULL COMMENT '年龄',
    `gender` tinyint DEFAULT NULL COMMENT '性别(1男 2女)',
    `status` int DEFAULT NULL COMMENT '状态(0正常 其他数值自定义)',
    `createtime` datetime DEFAULT NULL COMMENT '入职时间',
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

    1.4 插入测试数据(见笔记中 INSERT 语句,此处略)


    二、索引管理与优化

    2.1 查看索引

    sql

    SHOW INDEX FROM tb_user;

    2.2 创建普通索引、唯一索引、联合索引

    sql

    CREATE INDEX idx_use_name ON tb_user(name);
    CREATE UNIQUE INDEX idx_use_phone ON tb_user(phone);
    CREATE INDEX idx_use_profession_age_status ON tb_user(profession, age, status);

    2.3 删除索引

    sql

    DROP INDEX idx_use_profession_age_status ON tb_user;

    2.4 通过 ALTER 添加索引

    sql

    ALTER TABLE tb_user ADD INDEX idx_use_email(email);

    2.5 前缀索引(提高长字符串字段的效率)

    sql

    CREATE INDEX idx_use_name_prefix ON tb_user(name(3));
    — 适用场景:WHERE name LIKE '张%' 等前缀匹配

    2.6 索引失效常见情况

    • 对索引列使用函数或运算

    • 字符串类型字段不加引号

    • 模糊查询以 % 开头(如 LIKE '%张')

    • OR 连接的列中有未索引的列

    2.7 索引设计原则

    • 数据量大的表才考虑索引

    • 选择区分度高的列

    • 联合索引遵循最左前缀原则

    • 避免过多索引,维护成本高


    三、SQL 性能分析工具

    3.1 查看 SQL 执行频率

    sql

    SHOW GLOBAL STATUS LIKE 'Com_______';

    3.2 慢查询日志

    sql

    — 查看状态
    SHOW VARIABLES LIKE 'slow_query_log';
    — 开启
    SET GLOBAL slow_query_log = 1;
    — 设置阈值(秒)
    SET GLOBAL long_query_time = 1;

    3.3 Profile 分析

    sql

    — 查看是否支持
    SELECT @@have_profiling;
    — 开启
    SET profiling = 1;
    — 查看 SQL 耗时
    SHOW PROFILES;
    — 查看详细 CPU 等耗时
    SHOW PROFILE CPU FOR QUERY 41;

    3.4 EXPLAIN 执行计划

    sql

    EXPLAIN SELECT * FROM tb_user WHERE id = 1;
    — 重点关注 type、key、rows、Extra 等字段


    四、视图、存储过程与变量

    4.1 视图

    sql

    — 创建/替换视图
    CREATE OR REPLACE VIEW stu_v_1 AS SELECT id,name,age FROM tb_user WHERE id <= 10;
    — 查询视图
    SELECT * FROM stu_v_1 WHERE id > 5;
    — 删除视图
    DROP VIEW stu_v_1;
    — 带检查选项的视图
    CREATE OR REPLACE VIEW stu_v_1 AS SELECT id,name,age FROM tb_user WHERE id >= 0 WITH CASCADED CHECK OPTION;

    4.2 存储过程

    sql

    — 创建
    CREATE PROCEDURE proc_1()
    BEGIN
    SELECT COUNT(*) FROM tb_user;
    END;
    — 调用
    CALL proc_1();
    — 查看存储过程
    SHOW PROCEDURE STATUS;
    — 删除
    DROP PROCEDURE proc_1;

    4.3 变量

    • 系统变量:SHOW SESSION VARIABLES; / SHOW GLOBAL VARIABLES;

    • 用户自定义变量:SET @myname = 'itcast'; SELECT @myage := 18;

    • 局部变量(存储过程内):DECLARE myname VARCHAR(20);


    五、锁机制

    5.1 全局锁

    sql

    FLUSH TABLES WITH READ LOCK; — 全局只读
    UNLOCK TABLES; — 解锁

    5.2 表锁

    sql

    LOCK TABLES tb_user READ; — 读锁
    LOCK TABLES tb_user WRITE; — 写锁
    UNLOCK TABLES;

    5.3 行锁(InnoDB 自动加)

    • 共享锁:SELECT … LOCK IN SHARE MODE;

    • 排他锁:SELECT … FOR UPDATE;

    • INSERT/UPDATE/DELETE 自动加排他锁

    5.4 注意事项

    • 行锁基于索引,无索引可能升级为表锁

    • 可重复读隔离级别下,范围查询会加间隙锁

    • 避免长事务,减少锁等待


    六、日志管理

    6.1 错误日志

    sql

    SHOW VARIABLES LIKE '%log_error%';
    — 系统命令查看最后50行
    — tail -50 /var/log/mysql/error.log

    6.2 二进制日志(binlog)

    sql

    — 查看是否开启
    SHOW VARIABLES LIKE 'log_bin';
    — 查看日志文件列表
    SHOW BINARY LOGS;
    — 查看当前正在写入的文件
    SHOW MASTER STATUS;
    — 查看 binlog 事件
    SHOW BINLOG EVENTS IN 'mysql-bin.000001';
    — 删除所有 binlog
    RESET MASTER;
    — 删除指定编号之前的日志
    PURGE MASTER LOGS TO 'mysql-bin.000010';
    — 删除7天前的日志
    PURGE MASTER LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);

    6.3 binlog 格式

    • STATEMENT:记录 SQL 语句(日志小,不安全)

    • ROW:记录行变化(安全,日志略大,推荐)

    • MIXED:混合模式

    sql

    SHOW VARIABLES LIKE 'binlog_format';
    SET GLOBAL binlog_format = 'ROW';

    6.4 慢查询日志

    sql

    — 查看状态及文件位置
    SHOW VARIABLES LIKE 'slow_query%';
    SHOW VARIABLES LIKE 'long_query_time';
    — 开启并设置阈值
    SET GLOBAL slow_query_log = 1;
    SET GLOBAL long_query_time = 2;
    — 测试慢查询
    SELECT SLEEP(3);


    七、MySQL 常用管理工具

    工具用途示例
    mysql 客户端执行 SQL mysql -u root -p -e "SELECT 1"
    mysqladmin 管理操作 mysqladmin -u root -p status
    mysqldump 逻辑备份 mysqldump -u root -p –all-databases > all.sql
    mysqlshow 查看库/表/列信息 mysqlshow -u root -p mydb
    mysqlimport 导入文本文件 mysqlimport -u root -p test /tmp/city.txt
    source 执行 SQL 脚本 source /root/script.sql

    八、主从复制与读写分离(基于 MyCAT)

    8.1 环境

    • 主库 Master:192.168.21.100,root 密码 123

    • 从库 Slave:192.168.21.122,root 密码 123

    • MyCAT 中间件:部署于主库机器,端口 8066

    8.2 主库配置

    编辑 /opt/mysql/my.cnf:

    ini

    [mysqld]
    server-id = 1
    log-bin = /opt/mysql/data/mysql-bin
    binlog_format = ROW

    重启 MySQL,创建复制用户:

    sql

    CREATE USER 'repl'@'192.168.21.%' IDENTIFIED BY 'repl123';
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.21.%';
    FLUSH PRIVILEGES;
    SHOW MASTER STATUS; — 记录 File 和 Position

    8.3 从库配置

    编辑 /opt/mysql/my.cnf:

    ini

    [mysqld]
    server-id = 2
    relay-log = /opt/mysql/data/mysql-relay-bin

    重启从库,并配置主库连接:

    sql

    CHANGE MASTER TO
    MASTER_HOST = '192.168.21.100',
    MASTER_USER = 'repl',
    MASTER_PASSWORD = 'repl123',
    MASTER_LOG_FILE = 'mysql-bin.000009',
    MASTER_LOG_POS = 512;
    START SLAVE;
    SHOW SLAVE STATUS\\G — 确保 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes

    8.4 MyCAT 读写分离配置

    schema.xml

    xml

    <schema name="db_01" checkSQLschema="true" sqlMaxLimit="100">
    <table name="tb_order" dataNode="dn1" />
    </schema>
    <dataNode name="dn1" dataHost="dhost1" database="db01" />
    <dataHost name="dhost1" maxCon="1000" minCon="10" balance="1"
    writeType="0" dbType="mysql" dbDriver="native" switchType="1">
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostM1" url="192.168.21.100:3306" user="root" password="123">
    <readHost host="hostS1" url="192.168.21.122:3306" user="root" password="123" />
    </writeHost>
    </dataHost>

    • balance=1:读请求分发到 writeHost 和 readHost,实现读写分离。

    server.xml

    xml

    <user name="root" defaultAccount="true">
    <property name="password">123</property>
    <property name="schemas">db_01</property>
    </user>

    8.5 MyCAT 启动与自启

    bash

    # 创建 systemd 服务
    cat > /etc/systemd/system/mycat.service <<EOF
    [Unit]
    Description=MyCAT Server
    After=network.target
    [Service]
    Type=forking
    ExecStart=/usr/local/mycat/bin/mycat start
    ExecStop=/usr/local/mycat/bin/mycat stop
    ExecReload=/usr/local/mycat/bin/mycat restart
    User=root
    Group=root
    Restart=on-failure
    [Install]
    WantedBy=multi-user.target
    EOF

    systemctl daemon-reload
    systemctl start mycat
    systemctl enable mycat

    8.6 测试读写分离

  • 停止从库复制:STOP SLAVE;

  • 通过 MyCAT 插入数据:INSERT INTO tb_order VALUES (10, 'test');

  • 通过 MyCAT 查询:应看不到刚插入的数据(读走从库)

  • 恢复复制:START SLAVE;


  • 九、分库分表知识点(概念层面)

    概念说明
    垂直分库 按业务模块拆分(订单库、用户库)
    垂直分表 把宽表按列拆分(热点列与冷列分离)
    水平分库/分表 按分片键取模或范围分散数据
    分片键 决定数据分布的关键字段
    全局唯一ID 雪花算法、Leaf、UUID
    跨分片查询 排序、聚合、JOIN 复杂,需中间件支持
    常见中间件 ShardingSphere(推荐)、MyCAT、Vitess

    十、常见问题及解决

    10.1 远程连接拒绝:Access denied for user 'root'@'boot'

    • 原因:MySQL 主机名解析干扰

    • 解决:在 /opt/mysql/my.cnf 添加 skip-name-resolve,重启并重置 'root'@'%' 密码

    10.2 My CAT 启动失败,日志报 注释中不允许出现字符串 "–"

    • 原因:XML 注释中包含连续短横线

    • 解决:删除或修改注释,避免 —

    10.3 MyCAT 执行 SQL 报 Invalid DataSource:0

    • 原因:My CAT 无法连接后端 MySQL

    • 解决:检查主从库是否可远程连接,确保物理数据库 db01 存在

    10.4 表不存在 Table 'db01.tb_order' doesn't exist

    • 原因:表名大小写不一致或表未创建

    • 解决:统一使用小写表名,在后端主库创建表

                                                      

    赞(0)
    未经允许不得转载:171主机测评 » MySQL笔记
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址