作为一名经历过多个ERP系统开发的数据库工程师,我深知MySQL在企业管理系统中扮演着核心角色。不同于普通Web应用,ERP系统对数据完整性、事务处理和查询性能有着更高要求。本文将分享我在ERP项目中总结的MySQL实战经验,涵盖从基础操作到高级查询的完整知识体系。
在ERP环境下,数据库设计需要特别关注几个关键点:首先是数据一致性,所有业务单据必须保证ACID特性;其次是查询效率,面对百万级订单数据时,一个糟糕的SQL可能导致系统瘫痪;最后是扩展性,要为企业未来的业务增长预留空间。接下来,我将从实际案例出发,详细解析MySQL在ERP系统中的正确打开方式。
在ERP项目实施中,规范的数据库操作是基础中的基础。以下是经过多个项目验证的最佳实践:
sql复制-- 创建ERP生产数据库(必须指定字符集和排序规则)
CREATE DATABASE IF NOT EXISTS erp_production
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_general_ci;
-- 切换数据库时显式声明
USE erp_production;
-- 删除测试数据库(生产环境慎用)
DROP DATABASE IF EXISTS erp_test;
关键提示:所有ERP系统数据库必须使用utf8mb4字符集,这是支持emoji和生僻字的必要条件。我曾遇到过一个项目因为使用utf8导致客户特殊符号存储异常,最终不得不进行数据迁移。
成熟的ERP项目通常需要维护多套环境:
erp_dev后缀,字符集可放宽限制erp_qa后缀,必须与生产环境配置一致erp_financeERP系统中数值类型的选择直接影响数据精度和存储效率:
| 数据类型 | 存储空间 | ERP典型场景 | 避坑指南 |
|---|---|---|---|
| TINYINT | 1字节 | 状态标志(0/1) | 明确指定UNSIGNED避免负数 |
| INT | 4字节 | 常规ID、数量 | 10亿级数据需用BIGINT |
| BIGINT | 8字节 | 单据编号、交易流水 | 主键首选,避免溢出 |
| DECIMAL | 变长 | 金额、单价、税率 | 指定足够精度(如DECIMAL(19,4)) |
sql复制-- 财务模块字段定义示例
CREATE TABLE erp_invoice (
amount DECIMAL(19,4) NOT NULL COMMENT '含税金额',
tax_rate DECIMAL(5,4) NOT NULL COMMENT '税率',
quantity DECIMAL(12,3) NOT NULL COMMENT '数量'
);
ERP系统中字符串处理有特殊要求:
sql复制-- 客户表字段定义示例
CREATE TABLE erp_customer (
cust_code CHAR(10) NOT NULL COMMENT '客户编码',
cust_name VARCHAR(100) NOT NULL COMMENT '客户名称',
address VARCHAR(200) COMMENT '地址',
contract TEXT COMMENT '合同文本' -- 超过5000字考虑分表存储
);
ERP系统对时间记录有严格要求:
| 类型 | 范围 | ERP使用场景 | 时区影响 |
|---|---|---|---|
| DATETIME | 1000-9999年 | 业务发生时间 | 无 |
| TIMESTAMP | 1970-2038年 | 系统自动记录时间 | 有 |
| DATE | 日期部分 | 有效期、生日等 | 无 |
sql复制-- 订单时间字段设计
CREATE TABLE erp_order (
order_time DATETIME NOT NULL COMMENT '订单创建时间',
pay_time DATETIME NULL COMMENT '支付时间',
system_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '系统记录时间'
);
sql复制-- 标准的ERP工单表示例
CREATE TABLE erp_work_order (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
order_no VARCHAR(32) UNIQUE NOT NULL COMMENT '工单编号',
status TINYINT NOT NULL DEFAULT 1 COMMENT '状态:1-待处理,2-进行中,3-已完成',
creator_id BIGINT NOT NULL COMMENT '创建人ID',
create_time DATETIME NOT NULL COMMENT '创建时间',
update_time DATETIME NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=InnoDB COMMENT='工单主表';
ERP系统中数据删除必须采用逻辑删除:
sql复制-- 添加删除标记字段
ALTER TABLE erp_order ADD COLUMN is_deleted TINYINT NOT NULL DEFAULT 0 COMMENT '删除标记:0-未删除,1-已删除';
-- 删除操作转化为更新
UPDATE erp_order SET is_deleted = 1 WHERE order_no = 'SO20230001';
-- 查询时过滤已删除数据
SELECT * FROM erp_order WHERE is_deleted = 0;
ERP系统批量插入需要考虑性能:
sql复制-- 单条插入(不推荐批量使用)
INSERT INTO erp_product (product_code, product_name)
VALUES ('P001', '笔记本电脑');
-- 批量插入(ERP推荐方案)
INSERT INTO erp_product (product_code, product_name)
VALUES
('P002', '无线鼠标'),
('P003', '机械键盘'),
('P004', '显示器');
-- 从查询结果插入(数据迁移场景)
INSERT INTO erp_product_archive (product_code, product_name)
SELECT product_code, product_name FROM erp_product
WHERE create_time < '2022-01-01';
ERP系统查询需要兼顾性能和准确性:
sql复制-- 基础查询(必须指定字段)
SELECT product_code, product_name, price
FROM erp_product
WHERE category_id = 10;
-- 分页查询(大数据量必须加排序)
SELECT * FROM erp_order
ORDER BY create_time DESC
LIMIT 20 OFFSET 0; -- 第一页
-- 存在性检查(EXISTS性能优于IN)
SELECT * FROM erp_customer c
WHERE EXISTS (
SELECT 1 FROM erp_order o
WHERE o.customer_id = c.id
);
ERP系统更新操作需要特别注意:
sql复制-- 单字段更新
UPDATE erp_inventory
SET stock_qty = stock_qty - 10
WHERE product_id = 100 AND warehouse_id = 1;
-- 多表关联更新(谨慎使用)
UPDATE erp_order o, erp_customer c
SET o.discount = 0.9
WHERE o.customer_id = c.id
AND c.vip_level = 'PLATINUM';
-- 带子查询的更新
UPDATE erp_product
SET price = price * 1.1
WHERE category_id IN (
SELECT id FROM erp_category
WHERE is_hot = 1
);
ERP系统90%的查询涉及多表关联:
sql复制-- 内连接(获取有效订单)
SELECT o.order_no, c.customer_name
FROM erp_order o
INNER JOIN erp_customer c ON o.customer_id = c.id
WHERE o.status = 2;
-- 左连接(获取所有客户订单情况)
SELECT c.customer_name, COUNT(o.id) AS order_count
FROM erp_customer c
LEFT JOIN erp_order o ON c.id = o.customer_id
GROUP BY c.id;
-- 三表关联(订单-产品-类别)
SELECT o.order_no, p.product_name, c.category_name
FROM erp_order_detail od
JOIN erp_order o ON od.order_id = o.id
JOIN erp_product p ON od.product_id = p.id
JOIN erp_category c ON p.category_id = c.id;
ERP报表统计的核心技术:
sql复制-- 基础聚合
SELECT
COUNT(*) AS total_orders,
SUM(amount) AS total_amount,
AVG(amount) AS avg_amount
FROM erp_order
WHERE create_time BETWEEN '2023-01-01' AND '2023-01-31';
-- 分组聚合(按客户统计)
SELECT
customer_id,
COUNT(*) AS order_count,
SUM(amount) AS total_spent
FROM erp_order
GROUP BY customer_id
HAVING COUNT(*) > 5; -- 筛选优质客户
-- 多维度统计(按年月分组)
SELECT
YEAR(create_time) AS year,
MONTH(create_time) AS month,
SUM(amount) AS monthly_sales
FROM erp_order
GROUP BY YEAR(create_time), MONTH(create_time)
ORDER BY year DESC, month DESC;
ERP复杂查询的性能关键:
sql复制-- IN子查询(适合小数据集)
SELECT * FROM erp_product
WHERE category_id IN (
SELECT id FROM erp_category
WHERE is_active = 1
);
-- EXISTS子查询(适合大数据集)
SELECT * FROM erp_customer c
WHERE EXISTS (
SELECT 1 FROM erp_order o
WHERE o.customer_id = c.id
AND o.amount > 10000
);
-- FROM子句子查询(复杂统计)
SELECT t.year, t.month, t.total_sales
FROM (
SELECT
YEAR(create_time) AS year,
MONTH(create_time) AS month,
SUM(amount) AS total_sales
FROM erp_order
GROUP BY YEAR(create_time), MONTH(create_time)
) t
WHERE t.total_sales > 100000;
ERP业务操作必须使用事务:
sql复制-- 采购入库事务示例
START TRANSACTION;
-- 减少供应商应付
UPDATE erp_supplier_account
SET payable = payable - 1000
WHERE supplier_id = 5;
-- 增加库存
UPDATE erp_inventory
SET quantity = quantity + 100
WHERE product_id = 8 AND warehouse_id = 1;
-- 记录入库单
INSERT INTO erp_stock_in (form_no, supplier_id, total_amount)
VALUES ('SI20230001', 5, 1000);
COMMIT;
-- 出现异常时执行 ROLLBACK;
ERP系统必须合理使用索引:
sql复制-- 为订单表创建索引
ALTER TABLE erp_order ADD INDEX idx_customer (customer_id);
ALTER TABLE erp_order ADD INDEX idx_status_create (status, create_time);
-- 查看索引使用情况
EXPLAIN SELECT * FROM erp_order WHERE customer_id = 100;
ERP历史数据处理策略:
sql复制-- 创建归档表(结构与原表相同)
CREATE TABLE erp_order_archive LIKE erp_order;
-- 迁移历史数据
INSERT INTO erp_order_archive
SELECT * FROM erp_order
WHERE create_time < '2020-01-01';
-- 删除原表数据(需在事务中执行)
DELETE FROM erp_order
WHERE create_time < '2020-01-01';
理解MySQL执行计划是优化的基础:
sql复制-- 分析查询执行计划
EXPLAIN FORMAT=JSON
SELECT c.customer_name, SUM(o.amount) AS total
FROM erp_customer c
JOIN erp_order o ON c.id = o.customer_id
WHERE o.create_time > '2023-01-01'
GROUP BY c.id
HAVING total > 10000;
关键指标解读:
ERP系统必须定期分析慢查询:
sql复制-- 开启慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1; -- 超过1秒的记录
-- 查看慢查询日志位置
SHOW VARIABLES LIKE '%slow_query_log%';
-- 使用pt-query-digest分析慢日志
-- shell> pt-query-digest /var/log/mysql/mysql-slow.log
超大型ERP表的分区策略:
sql复制-- 按时间范围分区
CREATE TABLE erp_order_history (
id BIGINT NOT NULL,
order_no VARCHAR(32) NOT NULL,
create_time DATETIME NOT NULL,
-- 其他字段...
PRIMARY KEY (id, create_time)
) PARTITION BY RANGE (YEAR(create_time)) (
PARTITION p2020 VALUES LESS THAN (2021),
PARTITION p2021 VALUES LESS THAN (2022),
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
-- 查询特定分区数据
SELECT * FROM erp_order_history PARTITION(p2022);
ERP数据库权限最小化原则:
sql复制-- 创建应用账号
CREATE USER 'erp_app'@'192.168.1.%' IDENTIFIED BY 'ComplexPwd123!';
-- 授予最小权限
GRANT SELECT, INSERT, UPDATE ON erp_production.* TO 'erp_app'@'192.168.1.%';
GRANT DELETE ON erp_temp.* TO 'erp_app'@'192.168.1.%'; -- 仅临时表允许删除
-- 报表账号只读权限
CREATE USER 'erp_report'@'10.0.0.%' IDENTIFIED BY 'ReportPwd456!';
GRANT SELECT ON erp_production.* TO 'erp_report'@'10.0.0.%';
敏感数据加密存储:
sql复制-- 使用AES加密函数
INSERT INTO erp_employee (
name,
id_card_no,
bank_account
) VALUES (
'张三',
AES_ENCRYPT('110101199001011234', 'encryption_key'),
AES_ENCRYPT('6225888888888888', 'encryption_key')
);
-- 查询时解密
SELECT
name,
AES_DECRYPT(id_card_no, 'encryption_key') AS id_card_no
FROM erp_employee;
关键操作审计跟踪:
sql复制-- 创建审计日志表
CREATE TABLE erp_audit_log (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
action VARCHAR(50) NOT NULL,
table_name VARCHAR(50) NOT NULL,
record_id BIGINT NOT NULL,
old_value JSON,
new_value JSON,
ip_address VARCHAR(50),
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
) COMMENT '数据变更审计日志';
-- 通过触发器实现审计(示例)
DELIMITER //
CREATE TRIGGER tr_erp_order_audit
AFTER UPDATE ON erp_order
FOR EACH ROW
BEGIN
IF NEW.amount != OLD.amount THEN
INSERT INTO erp_audit_log (
user_id, action, table_name,
record_id, old_value, new_value
) VALUES (
@current_user_id, 'UPDATE', 'erp_order',
NEW.id,
JSON_OBJECT('amount', OLD.amount),
JSON_OBJECT('amount', NEW.amount)
);
END IF;
END//
DELIMITER ;
ERP系统常见死锁场景:
sql复制-- 查看最近死锁日志
SHOW ENGINE INNODB STATUS;
-- 死锁避免策略:
-- 1. 事务要小且快
-- 2. 多表操作保持一致的顺序
-- 3. 合理设置隔离级别(通常用READ COMMITTED)
-- 4. 为高频竞争索引添加等待超时
-- 设置锁等待超时(秒)
SET GLOBAL innodb_lock_wait_timeout = 30;
ERP读写分离架构下的同步异常:
sql复制-- 查看从库状态
SHOW SLAVE STATUS\G
-- 常见错误处理:
-- 1. 主键冲突:跳过错误或修复数据
-- 2. 数据不存在:补充缺失数据
-- 3. 网络中断:重建复制链路
-- 临时跳过错误(慎用)
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;
ERP系统数据修复方案:
sql复制-- 使用pt-table-checksum校验数据
-- shell> pt-table-checksum --replicate=erp_checksum.checksums h=master,u=check_user,p=password
-- 使用pt-table-sync修复差异
-- shell> pt-table-sync --replicate=erp_checksum.checksums h=master,u=admin,p=password --execute
-- 业务层校验脚本示例
SELECT
(SELECT COUNT(*) FROM erp_order) AS master_count,
(SELECT COUNT(*) FROM erp_order@slave1) AS slave1_count,
(SELECT COUNT(*) FROM erp_order@slave2) AS slave2_count;
典型采购流程数据模型:
sql复制-- 供应商主表
CREATE TABLE erp_supplier (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
supplier_code VARCHAR(20) UNIQUE NOT NULL,
supplier_name VARCHAR(100) NOT NULL,
contact_phone VARCHAR(20),
bank_account VARCHAR(50),
tax_number VARCHAR(30),
status TINYINT DEFAULT 1 COMMENT '1-合作中,2-已终止',
create_time DATETIME NOT NULL,
update_time DATETIME NOT NULL ON UPDATE CURRENT_TIMESTAMP
) COMMENT '供应商主表';
-- 采购订单主表
CREATE TABLE erp_purchase_order (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
po_no VARCHAR(30) UNIQUE NOT NULL,
supplier_id BIGINT NOT NULL,
total_amount DECIMAL(19,4) NOT NULL,
payment_status TINYINT DEFAULT 1 COMMENT '1-未付款,2-部分付款,3-已付清',
create_user_id BIGINT NOT NULL,
create_time DATETIME NOT NULL,
FOREIGN KEY (supplier_id) REFERENCES erp_supplier(id)
) COMMENT '采购订单主表';
-- 采购订单明细表
CREATE TABLE erp_purchase_order_detail (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
po_id BIGINT NOT NULL,
product_id BIGINT NOT NULL,
quantity DECIMAL(12,3) NOT NULL,
unit_price DECIMAL(12,4) NOT NULL,
total_price DECIMAL(19,4) NOT NULL,
received_quantity DECIMAL(12,3) DEFAULT 0,
FOREIGN KEY (po_id) REFERENCES erp_purchase_order(id),
FOREIGN KEY (product_id) REFERENCES erp_product(id)
) COMMENT '采购订单明细表';
月度销售分析报表查询:
sql复制SELECT
c.customer_name,
c.customer_level,
DATE_FORMAT(o.create_time, '%Y-%m') AS month,
COUNT(DISTINCT o.id) AS order_count,
SUM(od.quantity) AS total_quantity,
SUM(od.quantity * od.unit_price) AS total_amount,
ROUND(SUM(od.quantity * od.unit_price) / COUNT(DISTINCT o.id), 2) AS avg_order_amount
FROM erp_order o
JOIN erp_order_detail od ON o.id = od.order_id
JOIN erp_customer c ON o.customer_id = c.id
WHERE o.create_time BETWEEN '2023-01-01' AND '2023-12-31'
AND o.status = 4 -- 已完成订单
GROUP BY c.id, DATE_FORMAT(o.create_time, '%Y-%m')
ORDER BY total_amount DESC
LIMIT 100;
实时库存监控方案:
sql复制-- 创建库存预警视图
CREATE VIEW erp_inventory_alert AS
SELECT
p.product_code,
p.product_name,
w.warehouse_name,
i.current_quantity,
i.safety_stock,
i.locked_quantity,
CASE
WHEN i.current_quantity - i.locked_quantity <= i.safety_stock * 0.5 THEN '严重不足'
WHEN i.current_quantity - i.locked_quantity <= i.safety_stock THEN '不足'
ELSE '正常'
END AS stock_status
FROM erp_inventory i
JOIN erp_product p ON i.product_id = p.id
JOIN erp_warehouse w ON i.warehouse_id = w.id
WHERE i.current_quantity - i.locked_quantity <= i.safety_stock;
-- 使用视图查询
SELECT * FROM erp_inventory_alert
WHERE stock_status IN ('严重不足', '不足')
ORDER BY warehouse_name, product_code;
ERP系统典型索引优化案例:
sql复制-- 问题SQL(执行时间>3s)
SELECT * FROM erp_order
WHERE customer_id = 100
AND status = 2
AND create_time BETWEEN '2023-01-01' AND '2023-12-31';
-- 优化方案1:创建复合索引
ALTER TABLE erp_order ADD INDEX idx_customer_status_time (customer_id, status, create_time);
-- 优化方案2:使用覆盖索引
SELECT id, order_no, customer_id -- 只查询索引包含的字段
FROM erp_order
WHERE customer_id = 100
AND status = 2;
-- 优化方案3:索引条件下推(ICP)
SET optimizer_switch = 'index_condition_pushdown=on';
复杂查询优化策略:
sql复制-- 原始查询(使用OR导致索引失效)
SELECT * FROM erp_product
WHERE category_id = 5 OR price > 1000;
-- 优化为UNION ALL
SELECT * FROM erp_product WHERE category_id = 5
UNION ALL
SELECT * FROM erp_product WHERE price > 1000
AND (category_id != 5 OR category_id IS NULL);
-- 使用CASE表达式优化分组
SELECT
product_type,
COUNT(*) AS total_count,
SUM(CASE WHEN create_time > '2023-01-01' THEN 1 ELSE 0 END) AS new_count
FROM erp_product
GROUP BY product_type;
深度解读EXPLAIN结果:
sql复制-- 生成详细执行计划
EXPLAIN FORMAT=JSON
SELECT c.customer_name, SUM(o.amount) AS total
FROM erp_customer c
JOIN erp_order o ON c.id = o.customer_id
WHERE o.create_time > '2023-01-01'
GROUP BY c.id
HAVING total > 10000;
-- 关键指标分析:
-- 1. "cost_info": 评估执行成本
-- 2. "table": 访问的表及访问方式
-- 3. "attached_condition": 应用的条件
-- 4. "optimized_away": 是否被优化掉
ERP系统数据库高可用方案:
sql复制-- 在主库创建复制账号
CREATE USER 'repl'@'%' IDENTIFIED BY 'ReplPwd123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- 查看主库二进制日志位置
SHOW MASTER STATUS;
-- 在从库配置复制
CHANGE MASTER TO
MASTER_HOST='master_host',
MASTER_USER='repl',
MASTER_PASSWORD='ReplPwd123!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;
ERP系统读写分离策略:
sql复制-- 使用MySQL Router实现自动路由
-- shell> mysqlrouter --bootstrap user@master:3306 --directory myrouter --user=mysql
-- 应用层读写分离配置示例(Java)
/*
spring:
datasource:
master:
url: jdbc:mysql://master:3306/erp
username: app_user
password: AppPwd123!
slave:
url: jdbc:mysql://slave:3306/erp
username: app_user
password: AppPwd123!
*/
ERP数据库故障应急处理:
sql复制-- 手动故障转移步骤
-- 1. 提升从库为主库
STOP SLAVE;
RESET MASTER;
SET GLOBAL read_only = OFF;
-- 2. 修改其他从库指向新主库
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='new_master';
START SLAVE;
-- 3. 应用修改连接配置
ERP系统全量备份方案:
bash复制# 使用Percona XtraBackup热备份
# shell> xtrabackup --backup --target-dir=/backups/full --user=backup_user --password=BackupPwd123!
# 准备备份
# shell> xtrabackup --prepare --target-dir=/backups/full
# 恢复备份
# shell> xtrabackup --copy-back --target-dir=/backups/full
ERP数据逻辑备份方案:
bash复制# 使用mysqldump备份单库
# shell> mysqldump -u backup_user -pBackupPwd123! --single-transaction --routines --triggers erp_production > erp_backup.sql
# 恢复数据
# shell> mysql -u root -p < erp_backup.sql
ERP系统增量备份方案:
bash复制# 全量备份
# shell> xtrabackup --backup --target-dir=/backups/base --user=backup_user --password=BackupPwd123!
# 增量备份
# shell> xtrabackup --backup --target-dir=/backups/inc1 --incremental-basedir=/backups/base --user=backup_user --password=BackupPwd123!
# 恢复流程
# shell> xtrabackup --prepare --apply-log-only --target-dir=/backups/base
# shell> xtrabackup --prepare --apply-log-only --target-dir=/backups/base --incremental-dir=/backups/inc1
# shell> xtrabackup --copy-back --target-dir=/backups/base
ERP数据库核心监控项:
sql复制-- 查询当前连接数
SHOW STATUS LIKE 'Threads_connected';
-- 查看InnoDB缓冲池命中率
SELECT
(1 - (SELECT variable_value FROM performance_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_reads') /
(SELECT variable_value FROM performance_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_read_requests'))
AS buffer_pool_hit_ratio;
-- 查看锁等待情况
SELECT * FROM performance_schema.events_waits_current
WHERE event_name LIKE 'wait/synch/mutex/innodb%';
ERP数据库自动化脚本示例:
bash复制#!/bin/bash
# 自动备份脚本
BACKUP_DIR="/data/backups/mysql"
DATE=$(date +%Y%m%d)
LOG_FILE="/var/log/mysql_backup.log"
# 全量备份
mysqldump -u backup_user -pBackupPwd123! --all-databases --single-transaction \
--routines --triggers | gzip > $BACKUP_DIR/full_$DATE.sql.gz
# 清理30天前备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -exec rm {} \;
echo "$(date) - Backup completed" >> $LOG_FILE
ERP系统存储容量评估:
sql复制-- 计算表空间使用情况
SELECT
table_schema AS database_name,
table_name,
ROUND(data_length/1024/1024, 2) AS data_size_mb,
ROUND(index_length/1024/1024, 2) AS index_size_mb,
ROUND((data_length+index_length)/1024/1024, 2) AS total_size_mb,
table_rows
FROM information_schema.tables
WHERE table_schema = 'erp_production'
ORDER BY total_size_mb DESC;
-- 预测增长趋势(需结合历史数据分析)
ERP数据库升级检查清单:
sql复制-- 检查不兼容语法
SELECT * FROM information_schema.ROUTINES
WHERE DEFINER LIKE '%old_user%';
-- 检查已废弃的功能
SHOW VARIABLES LIKE '%deprecated%';
-- 检查外键约束
SELECT * FROM information_schema.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
AND TABLE_SCHEMA = 'erp_production';
MySQL主版本升级流程:
bash复制# 标准升级命令
# shell> mysql_upgrade -u root -p
ERP升级失败回滚策略:
bash复制# 回滚示例
# shell> systemctl stop mysql
# shell> yum remove mysql-community-server
# shell> yum install mysql-community-server-5.7
# shell> mysql -u root -p < backup.sql
# shell> systemctl start mysql
ERP系统云数据库配置:
sql复制-- 云数据库参数优化建议
SET GLOBAL innodb_buffer_pool_size = 12*1024*1024*1024; -- 12GB
SET GLOBAL innodb_io_capacity = 2000;
SET GLOBAL innodb_io_capacity_max = 4000;
云数据库读写分离实现:
sql复制-- 创建只读账号
CREATE USER 'erp_readonly'@'%' IDENTIFIED BY 'ReadonlyPwd123!';
GRANT SELECT ON erp_production.* TO 'erp_readonly'@'%';
-- 应用配置示例
/*
datasource:
master: jdbc:mysql://master.rds.aliyuncs.com:3306/erp
slaves:
- jdbc:mysql://slave1.rds.aliyuncs.com:3306/erp
- jdbc:mysql://slave2.rds.aliyuncs.com:3306/erp
*/
ERP多地域数据同步方案:
sql复制-- 配置跨地域复制
-- 阿里云示例:创建数据同步任务
-- 腾讯云示例:配置DTS数据同步
-- 监控同步延迟
SHOW SLAVE STATUS\G
-- 关注Seconds_Behind_Master参数
ERP系统JSON字段应用:
sql复制-- 创建包含JSON字段的表
CREATE TABLE erp_product_extra (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
product_id BIGINT NOT NULL,
attributes JSON NOT NULL COMMENT '产品扩展属性',
FOREIGN KEY (product_id) REFERENCES erp_product(id)
);
-- 插入JSON数据
INSERT INTO erp_product_extra (product_id, attributes)
VALUES (1, '{
"color": "黑色",
"weight": 1.5,
"dimensions": {
"length": 30,
"width": 20,
"height": 5
}
}');
-- 查询JSON字段
SELECT
product_id,
attributes->>'$.color' AS color,
attributes->>'$.dimensions.length' AS length
FROM erp_product_extra
WHERE JSON_EXTRACT(attributes, '$.weight') > 1.0;
ERP数据分析高级技巧:
sql复制-- 计算销售额排名
SELECT
salesperson_id,
SUM(amount) AS total_sales,
RANK() OVER (ORDER BY SUM(amount) DESC) AS sales_rank
FROM erp_order
WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY salesperson_id;
-- 计算移动平均
SELECT
product_id,
DATE_FORMAT(create_time, '%Y-%m') AS month,
SUM(quantity) AS monthly_sales,
AVG(SUM(quantity)) OVER (
PARTITION BY product_id
ORDER BY DATE_FORMAT(create_time, '%Y-%m')
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
) AS moving_avg
FROM erp_order_detail
GROUP BY product_id, DATE_FORMAT(create_time, '%Y-%m');
ERP层级数据查询方案:
sql复制-- 组织架构递归查询
WITH RECURSIVE org_h