)
mysql数据库数据库基础数据库设计对象关系分析 -- ER图数据表设计 --第一范式(属性值不能再次拆分)、第二范式(所有的属性必须和主键有关)、第三范式(和主键有直接关系)数据库软件mysql、redis、elasticsearchmysql软件分支mysql、mariadb、percona server软件安装的方式二进制【apt|yum、rpm|dpkg】、源码方式安装【预编译、纯源码】、实例数量【单实例、多实例】数据库环境整体环境客户端环境 mysql 、mysql -u(用户名) -p(密码) -P(指定数据库端口号默认3306) -h(指定数据库服务器IP或主机地址远程连接专用)服务端环境 mysqld(主进程) 配置文件 /etc/my.cnf客户端环境命令\s(查看数据库当前状态信息版本 端口) \r(重新连接数据库) \h(查看帮助命令) \c(终止取消当前输入)服务端环境命令sql类型DDL(data definition language 数据定义语言create alter drop truncate(删表)delect(删行))、DCL(data control language:数据控制语言grant 授权 revoke 授权)DQL(data query language 数据查询语言select from where group by having分组排序limt分页)DML(data manipulation language 数据操纵语言insert update delete )TCL(transaction control language 事务控制语言commit rollback savepoint保存点)数据库级别show、create、drop、alter数据表级别show、create、descmysql数据库sql语句table操作语句create alter、drop、数据操作语句insert、update、delete、truncate扩展对象视图、函数、存储过程、触发器、事件、事务、DCL:create user user10.0.0.% identified by 密码;alter user user10.0.0.% identified by 密码;grant all on *.* to user10.0.0.% with grant option;图形化工具navicatmysql的结构引擎MyISAM特点无事务、速度快【MYD(数据)、MYI(索引)、frm(表结构)、sid(系统标识文件,标记数据表唯一身份编号)】、InnoDB【idb(数据 索引)、frm(表结构)】配置全局配置【配置文件,永久生效所有会话通用】会话配置【set,用 set 命令设置仅当前连接生效断开失效】、select、show variables like %%;--------模糊查询系统变量索引单独存储、附加在数据表的字段上数据格式B树、单表理论上可以存储数千万条数据创建索引create index 名 on 表(字段)删除drop index 名事务特点ACID1. 原子性整体执行全成或全回滚2. 一致性事务前后数据状态合法统一3. 隔离性并发事务彼此互不干扰4. 持久性提交后数据永久生效问题脏读、不可重复读、幻读策略读未提交、读已提交、可重复读【默认】、序列化命令begin、commit、rollback日志事务redo log、undo log查询通用、错误、慢查询日志集群二进制日志、中继日志二进制日志命令show master logs; show binary logs;show master status; show binary log status;reset master; reset binary logs and gtids;purge master logs to ‘xxx’;show binary log events;备份类型全量、增量、差异、部分、热、冷、温、物理、逻辑1. 全量完整拷贝全部数据 2. 增量仅备份上次备份后新增改动 3. 差异备份最近全量后的变动数据 4. 部分仅备份指定局部数据 5. 热备份业务运行中备份无需停服 6. 冷备份停机离线状态下备份 7. 温备份低负载时段执行备份 8. 物理备份直接拷贝磁盘文件块 9. 逻辑备份解析导出数据表数据mysqldump[-A -B -F ] [库] [表]-A备份所有数据库 -B指定备份库带建库语句 -F刷新日志 [库]指定要备份的数据库 [表]指定要备份的表主从复制Ubuntu24.04 MySQL8.0 主从复制部署192.168.9.106 主192.168.9.107 从两台机器统一基础操作如下安装 MySQLapt update apt install mysql-server -y放行防火墙二台都执行ufw allow 3306/tcp主库配置 192.168.9.106修改配置文件vim /etc/mysql/mysql.conf.d/mysqld.cnf[mysqld] # 监听所有地址 bind-address 0.0.0.0 # 主从唯一ID主库1 server-id 1 # 开启二进制日志 log_bin /var/log/mysql/mysql-bin.log # 日志格式 binlog_format ROW # 可选只同步指定库 # binlog_do_db testdb # 跳过系统库 binlog_ignore_db mysql expire_logs_days 7重启 mysqlsystemctl restart mysql登录 MySQL 创建复制账号mysql -uroot -p# 创建从库连接账号 CREATE USER repl192.168.9.107 IDENTIFIED BY Repl123456; # 授予复制权限 GRANT REPLICATION SLAVE ON *.* TO repl192.168.9.107; FLUSH PRIVILEGES; # 锁表禁止写入记录binlog位置 FLUSH TABLES WITH READ LOCK; # 查看主库状态记住 File 和 Position SHOW MASTER STATUS;输出示例保存这两个值后面从库要用File: mysql-bin.000001Position: 156新开终端导出数据不要关闭当前 mysql 会话关闭会自动解锁全量备份主库数据mysqldump -uroot -p --all-databases --master-data2 --single-transaction all_db.sql把 all_db.sql 传到从库scp all_db.sql root192.168.9.107:/tmp/备份完成后回到 mysql 会话解锁UNLOCK TABLES;从库配置 192.168.9.107修改配置文件vim /etc/mysql/mysql.conf.d/mysqld.cnf[mysqld] bind-address 0.0.0.0 # server-id必须和主库不同设为2 server-id 2 # 开启中继日志 relay_log /var/log/mysql/relay-bin.log log_slave_updates 0 # 从库只读 read_only ON super_read_only ON重启 MySQLsystemctl restart mysql导入主库备份全新空环境可跳过mysql -uroot -p /tmp/all_db.sql登录 MySQL 配置主从关联mysql -uroot -p执行 SQL替换下面 FILE、POSITION 为主库 show master status 查到的值STOP SLAVE; RESET SLAVE ALL; CHANGE MASTER TO MASTER_HOST192.168.9.106, MASTER_USERrepl, MASTER_PASSWORDRepl123456, MASTER_LOG_FILEmysql-bin.000001, MASTER_LOG_POS156; START SLAVE;验证从库状态SHOW SLAVE STATUS\GSlave_IO_Running: YesSlave_SQL_Running: YesIO No网络不通、账号密码错误、主库 IP / 端口不对SQL No数据不一致、主键冲突、备份不全常用排错命令# 查看mysql日志 tail -f /var/log/mysql/error.log # 重启从同步 STOP SLAVE;START SLAVE; # 重建从同步数据不一致时慎用 RESET SLAVE ALL;MySQL8.0 默认密码认证插件如果遇到 repl 账号连接报错执行ALTER USER repl192.168.9.107 IDENTIFIED WITH mysql_native_password BY Repl123456;若两台机器全新无任何数据可以不用 mysqldump 备份直接搭建主从。集群类型: 复制风格、分布式风格mysql集群主从复制原理三个前提、三个线程、两个日志1. 复制风格单机数据同步备份 2. 分布式风格多节点拆分存储调度 3. 主从复制三前提主库开启 binlog、主从 server-id 不同、主从网络互通 4. 三个线程主库 dump 线程、从库 IO 线程、从库 SQL 线程 5. 两个日志二进制日志 binlog、中继日志 relay-logmsyql的主从复制原理主库开启 binlog节点 ID 唯一网络连通 数据变更写入二进制日志 dump 线程向外推送日志数据 从库 IO 线程接收存入中继日志 SQL 线程回放日志执行语句 最终主从数据保持同步mysql集群一主一从【新环境、旧环境】、一主多从、级联复制、双主复制、复制过滤器、半同步复制、GTID复制遇到问题的通用处理流程- 分析问题、定位错误关键字、解决数据本身的问题、忽略错误- 分析io问题、分析sql问题、分析程序问题一主一从新环境 主库开启 binlog → 从库全新配置 → 直接建立同步 → 无历史数据干扰 一主一从旧环境 先备份主库数据 → 导入从库 → 配置同步点位 → 启动复制追数据 一主多从 一个主库 → 分给多个从库 → 从库各自独立同步 → 实现读写分离、负载分摊 级联复制 主 → 从 1 → 从 2 主库只给从 1 发数据 → 从 1 再同步给从 2 → 减轻主库压力 双主复制 两台互为主从 → 都能写 → 自动互相同步 → 高可用切换 复制过滤器 只同步指定库 / 表 → 过滤不需要的数据 → 节省带宽、存储空间 半同步复制 主库写数据 → 至少一个从库接收成功 → 主才返回成功 → 数据更安全 GTID 复制 全局事务 ID → 自动定位同步位置 → 不用手动找点位 → 搭建、故障恢复更简单中间件功能读写分离、负载均衡、分库分表软件mycat、proxySQL高可用集群MGR集群【多主模式、单主模式[默认的-只有 1 个节点可写其他只读自动选主]】一主一从【有数据的、GTID|日志】 2个集群(有数据先备份导入再同步无数据直接配)rocky下部署mysql过程1.关闭防火墙、SELinuxsystemctl stop firewalld systemctl disable firewalld setenforce 0 vim /etc/selinux/config2.安装依赖yum install -y libaio-devel ncurses-devel numactl net-tools wget3.创建 MySQL 用户和数据目录useradd -r -s /sbin/nologin mysql mkdir -p /data/mysql chown -R mysql:mysql /data/mysql chmod -R 755 /data/mysql4.下载 / 上传 MySQL 安装包并解压cd /usr/local wget https://cdn.mysql.com/Downloads/MySQL-8.0/mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz tar -xf mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz mv mysql-8.0.36-linux-glibc2.28-x86_64 mysql chown -R mysql:mysql /usr/local/mysql5.编写 MySQL 配置文件 /etc/my.cnfvim /etc/my.cnf[mysqld] basedir /usr/local/mysql datadir /data/mysql socket /tmp/mysql.sock port 3306 user mysql server-id 1 log-bin mysql-bin binlog_format row character-set-server utf8mb4 default_storage_engine InnoDB max_connections 20006.初始化 MySQL/usr/local/mysql/bin/mysqld --initialize-insecure --usermysql --datadir/data/mysql --basedir/usr/local/mysql7.配置系统服务开机自启vim /etc/systemd/system/mysqld.service[Unit] DescriptionMySQL Server Documentationman:mysqld(8) Afternetwork.target [Service] Usermysql Groupmysql ExecStart/usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf ExecStop/usr/local/mysql/bin/mysqladmin shutdown Restarton-failure [Install] WantedBymulti-user.target8.配置环境变量echo export PATH$PATH:/usr/local/mysql/bin /etc/profile source /etc/profile9.登录 MySQL 并修改密码mysql -urootALTER USER rootlocalhost IDENTIFIED BY 123456; flush privileges; exit;测试登录mysql -uroot -p123456ubuntu下部署mariadb过程1.替换系统软件源sed -i s/cn.archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list.d/ubuntu.sources sed -i s/security.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list.d/ubuntu.sources apt update2,.安装工具并导入密钥apt install -y apt-transport-https curl mkdir -p /etc/apt/keyrings curl -o /etc/apt/keyrings/mariadb-keyring.pgp https://mariadb.org/mariadb_release_signing_key.pgp3.编辑 MariaDB 源文件vim /etc/apt/sources.list.d/mariadb.sourcesTypes: deb URIs: https://mirrors.tuna.tsinghua.edu.cn/mariadb/repo/11.8/ubuntu Suites: noble Components: main main/debug Signed-By: /etc/apt/keyrings/mariadb-keyring.pgp4.更新源并安装程序apt update apt install mariadb-server -y5.查验运行状态systemctl status mariadb getent passwd mysql ls -lh /var/lib/mysql/6.本地登录数据库mariadbmariadb使用crontab和mysqldump完成每一个小时完成一次数据库备份并且完成一次数据恢复准备两台主机主 rocky10-12、从 rocky10-151.统一关闭防火墙、关闭 selinuxsystemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i s/^SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config2.安装启动 MySQLdnf install mysql-server -y systemctl start mysqld systemctl enable mysqld3.设置 root 密码为 123456mysqladmin -uroot password 123456以上两台主机统一操作主节点 rocky10-12 配置vi /etc/my.cnf[mysqld] server-id12 log-binmysql-bin binlog-formatROW4.重启服务systemctl restart mysqld5.创建同步账号并授权mysql -uroot -p1234566.执行 SQL语句create user repl% identified by repl123; grant replication slave on *.* to repl%; flush privileges; show master status;从节点 rocky10-15 配置1.编辑配置文件vi /etc/my.cnf[mysqld] server-id15 relay-logmysql-relay-bin read_only12.重启服务systemctl restart mysqld3.关联主库开启同步mysql -uroot -p123456替换主库 IP、日志文件、位点后执行stop slave; change master to master_hostrocky10-12, master_userrepl, master_passwordrepl123, master_log_filemysql-bin.000001, master_log_pos157; start slave;4.查看检查主从状态show slave status\GSlave_IO_Runningyes Slave_SQL_Runningyes从节点配置每小时定时备份1.创建备份目录mkdir -p /home/backup2.编写备份脚本vi /home/backup/backup_mysql.sh#!/bin/bash TIME$(date %Y%m%d_%H%M%S) mysqldump -uroot -p123456 --all-databases --single-transaction --dump-slave2 /home/backup/mysql_${TIME}.sql3.赋予执行权限chmod x /home/backup/backup_mysql.sh4.测试脚本/home/backup/backup_mysql.sh5.crontab 设置每小时整点备份crontab -e添加一行0 * * * * /home/backup/backup_mysql.sh6.查看任务crontab -l数据恢复1.停止从库同步mysql -uroot -p123456 -e stop slave;2.选取最新备份文件恢复ls /home/backup mysql -uroot -p123456 /home/backup/对应备份文件名.sql3.重启同步并查看mysql -uroot -p123456 -e start slave; mysql -uroot -p123456 -e show slave status\G