AskTable

从零开始接入你的第一个数据源:MySQL 实战教程

AskTable 团队
AskTable 团队 2026年3月8日

本文将手把手教你接入第一个 MySQL 数据源到 AskTable,让你在 30 分钟内完成从零到可用的全过程。


一、准备工作

1. 你需要什么?

必需

可选

时间:30 分钟

2. 环境检查

检查 MySQL 版本

mysql --version
# 输出示例:mysql  Ver 8.0.32 for Linux on x86_64

检查 MySQL 是否运行

# Linux/Mac
sudo systemctl status mysql

# 或者
ps aux | grep mysql

检查网络连通性

# 测试本地连接
mysql -h localhost -u root -p

# 测试远程连接
mysql -h your_host -P 3306 -u root -p

二、创建测试数据库(可选)

如果你还没有数据库,可以创建一个测试数据库。

1. 创建数据库

-- 连接到 MySQL
mysql -u root -p

-- 创建数据库
CREATE DATABASE demo_shop CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 使用数据库
USE demo_shop;

2. 创建示例表

-- 用户表
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
    name VARCHAR(100) NOT NULL COMMENT '用户姓名',
    email VARCHAR(100) COMMENT '邮箱',
    phone VARCHAR(20) COMMENT '手机号',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) COMMENT='用户表';

-- 商品表
CREATE TABLE products (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '商品ID',
    name VARCHAR(200) NOT NULL COMMENT '商品名称',
    category VARCHAR(50) COMMENT '商品分类',
    price DECIMAL(10,2) NOT NULL COMMENT '价格',
    stock INT DEFAULT 0 COMMENT '库存',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) COMMENT='商品表';

-- 订单表
CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '订单ID',
    user_id INT NOT NULL COMMENT '用户ID',
    product_id INT NOT NULL COMMENT '商品ID',
    quantity INT NOT NULL COMMENT '数量',
    total_amount DECIMAL(10,2) NOT NULL COMMENT '总金额',
    status VARCHAR(20) DEFAULT 'pending' COMMENT '订单状态',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (product_id) REFERENCES products(id)
) COMMENT='订单表';

3. 插入测试数据

-- 插入用户
INSERT INTO users (name, email, phone) VALUES
('张三', 'zhangsan@example.com', '13800138000'),
('李四', 'lisi@example.com', '13800138001'),
('王五', 'wangwu@example.com', '13800138002');

-- 插入商品
INSERT INTO products (name, category, price, stock) VALUES
('iPhone 15', '手机', 5999.00, 100),
('MacBook Pro', '电脑', 12999.00, 50),
('AirPods Pro', '耳机', 1999.00, 200);

-- 插入订单
INSERT INTO orders (user_id, product_id, quantity, total_amount, status) VALUES
(1, 1, 1, 5999.00, 'paid'),
(1, 3, 2, 3998.00, 'paid'),
(2, 2, 1, 12999.00, 'pending'),
(3, 1, 1, 5999.00, 'shipped');

三、创建只读用户

为了安全,我们为 AskTable 创建一个只读用户。

1. 创建用户

-- 创建只读用户
CREATE USER 'asktable_readonly'@'%' IDENTIFIED BY 'your_strong_password_here';

-- 如果只允许特定 IP 访问
CREATE USER 'asktable_readonly'@'123.456.789.0' IDENTIFIED BY 'your_strong_password_here';

密码要求

2. 授予权限

-- 授予 demo_shop 数据库的只读权限
GRANT SELECT ON demo_shop.* TO 'asktable_readonly'@'%';

-- 授予查看表结构的权限
GRANT SHOW VIEW ON demo_shop.* TO 'asktable_readonly'@'%';

-- 刷新权限
FLUSH PRIVILEGES;

3. 验证权限

-- 查看用户权限
SHOW GRANTS FOR 'asktable_readonly'@'%';

-- 应该看到类似输出:
-- GRANT SELECT, SHOW VIEW ON `demo_shop`.* TO `asktable_readonly`@`%`

4. 测试连接

# 测试新用户能否连接
mysql -h localhost -u asktable_readonly -p demo_shop

# 测试查询
SELECT * FROM users LIMIT 1;

# 测试写入(应该失败)
INSERT INTO users (name) VALUES ('test');
# 应该报错:ERROR 1142 (42000): INSERT command denied

四、配置网络访问

1. 检查 MySQL 监听地址

# 查看 MySQL 配置
cat /etc/mysql/mysql.conf.d/mysqld.cnf | grep bind-address

# 如果是 127.0.0.1,需要改为 0.0.0.0

修改配置

# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
bind-address = 0.0.0.0

重启 MySQL

sudo systemctl restart mysql

2. 配置防火墙

Linux (iptables)

# 允许 3306 端口
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT

# 保存规则
sudo iptables-save

Linux (firewalld)

# 允许 MySQL 服务
sudo firewall-cmd --permanent --add-service=mysql
sudo firewall-cmd --reload

云服务器

3. 测试远程连接

# 从另一台机器测试
mysql -h your_server_ip -P 3306 -u asktable_readonly -p demo_shop

五、在 AskTable 中添加数据源

1. 登录 AskTable

访问 asktable.com 并登录。

2. 添加数据源

步骤 1:进入数据源页面

步骤 2:选择数据库类型

步骤 3:填写连接信息

名称:Demo Shop
主机:your_server_ip
端口:3306
数据库:demo_shop
用户名:asktable_readonly
密码:your_strong_password_here

步骤 4:高级配置(可选)

{
  "ssl": false,
  "charset": "utf8mb4",
  "timezone": "+08:00"
}

步骤 5:测试连接

步骤 6:保存数据源

3. 同步元数据

步骤 1:选择表

步骤 2:开始同步

步骤 3:查看元数据


六、测试查询

1. 第一个查询

在 AskTable 中输入:

查询所有用户

预期结果

2. 聚合查询

统计每个商品分类的商品数量

预期结果

3. 关联查询

查询每个用户的订单总额

预期结果

SELECT u.name, SUM(o.total_amount) as total
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name

七、常见问题解决

问题 1:连接超时

错误信息

Connection timeout

解决方案

  1. 检查服务器 IP 是否正确
  2. 检查端口是否正确(默认 3306)
  3. 检查防火墙是否开放
  4. 检查 MySQL 是否监听外网

测试命令

telnet your_server_ip 3306

问题 2:访问被拒绝

错误信息

Access denied for user 'asktable_readonly'@'xxx.xxx.xxx.xxx'

解决方案

  1. 检查用户名和密码
  2. 检查用户的主机限制
  3. 重新授权

修复命令

-- 删除旧用户
DROP USER 'asktable_readonly'@'%';

-- 重新创建
CREATE USER 'asktable_readonly'@'%' IDENTIFIED BY 'new_password';
GRANT SELECT ON demo_shop.* TO 'asktable_readonly'@'%';
FLUSH PRIVILEGES;

问题 3:找不到数据库

错误信息

Unknown database 'demo_shop'

解决方案

  1. 检查数据库名是否正确
  2. 检查数据库是否存在

检查命令

SHOW DATABASES;

问题 4:SSL 连接失败

错误信息

SSL connection error

解决方案

  1. 关闭 SSL(如果不需要)
  2. 配置正确的 SSL 证书

配置

{
  "ssl": false
}

问题 5:字符编码问题

现象:中文显示乱码

解决方案

{
  "charset": "utf8mb4"
}

八、性能优化建议

1. 添加索引

-- 为常用查询字段添加索引
CREATE INDEX idx_user_email ON users(email);
CREATE INDEX idx_product_category ON products(category);
CREATE INDEX idx_order_user_id ON orders(user_id);
CREATE INDEX idx_order_created_at ON orders(created_at);

2. 优化表结构

-- 添加更详细的注释
ALTER TABLE users MODIFY COLUMN name VARCHAR(100) COMMENT '用户姓名(必填)';
ALTER TABLE products MODIFY COLUMN price DECIMAL(10,2) COMMENT '商品价格(单位:元)';

3. 配置连接池

在 AskTable 中配置:

{
  "pool": {
    "min_size": 2,
    "max_size": 10,
    "connect_timeout": 10
  }
}

九、安全加固

1. 使用 SSL 连接

生成 SSL 证书

# 在 MySQL 服务器上
mysql_ssl_rsa_setup --datadir=/var/lib/mysql

配置 MySQL

[mysqld]
require_secure_transport=ON

在 AskTable 中启用 SSL

{
  "ssl": true,
  "ssl_ca": "/path/to/ca.pem"
}

2. 限制访问 IP

-- 只允许特定 IP 访问
CREATE USER 'asktable_readonly'@'123.456.789.0' IDENTIFIED BY 'password';
GRANT SELECT ON demo_shop.* TO 'asktable_readonly'@'123.456.789.0';

3. 定期更换密码

-- 更改密码
ALTER USER 'asktable_readonly'@'%' IDENTIFIED BY 'new_password';
FLUSH PRIVILEGES;

十、下一步

恭喜!你已经成功接入了第一个数据源。

继续学习

实践建议

  1. 尝试各种类型的查询
  2. 添加更多表和数据
  3. 配置权限控制
  4. 邀请团队成员使用

获取帮助


相关阅读

技术交流