
sidebar.wechat

sidebar.feishu
sidebar.chooseYourWayToJoin

sidebar.scanToAddConsultant
本文将手把手教你接入第一个 MySQL 数据源到 AskTable,让你在 30 分钟内完成从零到可用的全过程。
必需:
可选:
时间:30 分钟
检查 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
如果你还没有数据库,可以创建一个测试数据库。
-- 连接到 MySQL
mysql -u root -p
-- 创建数据库
CREATE DATABASE demo_shop CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 使用数据库
USE demo_shop;
-- 用户表
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='订单表';
-- 插入用户
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 创建一个只读用户。
-- 创建只读用户
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';
密码要求:
-- 授予 demo_shop 数据库的只读权限
GRANT SELECT ON demo_shop.* TO 'asktable_readonly'@'%';
-- 授予查看表结构的权限
GRANT SHOW VIEW ON demo_shop.* TO 'asktable_readonly'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
-- 查看用户权限
SHOW GRANTS FOR 'asktable_readonly'@'%';
-- 应该看到类似输出:
-- GRANT SELECT, SHOW VIEW ON `demo_shop`.* TO `asktable_readonly`@`%`
# 测试新用户能否连接
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
# 查看 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
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
云服务器:
# 从另一台机器测试
mysql -h your_server_ip -P 3306 -u asktable_readonly -p demo_shop
访问 asktable.com 并登录。
步骤 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:保存数据源
步骤 1:选择表
步骤 2:开始同步
步骤 3:查看元数据
在 AskTable 中输入:
查询所有用户
预期结果:
SELECT * FROM users统计每个商品分类的商品数量
预期结果:
SELECT category, COUNT(*) as count FROM products GROUP BY category查询每个用户的订单总额
预期结果:
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
错误信息:
Connection timeout
解决方案:
测试命令:
telnet your_server_ip 3306
错误信息:
Access denied for user 'asktable_readonly'@'xxx.xxx.xxx.xxx'
解决方案:
修复命令:
-- 删除旧用户
DROP USER 'asktable_readonly'@'%';
-- 重新创建
CREATE USER 'asktable_readonly'@'%' IDENTIFIED BY 'new_password';
GRANT SELECT ON demo_shop.* TO 'asktable_readonly'@'%';
FLUSH PRIVILEGES;
错误信息:
Unknown database 'demo_shop'
解决方案:
检查命令:
SHOW DATABASES;
错误信息:
SSL connection error
解决方案:
配置:
{
"ssl": false
}
现象:中文显示乱码
解决方案:
{
"charset": "utf8mb4"
}
-- 为常用查询字段添加索引
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);
-- 添加更详细的注释
ALTER TABLE users MODIFY COLUMN name VARCHAR(100) COMMENT '用户姓名(必填)';
ALTER TABLE products MODIFY COLUMN price DECIMAL(10,2) COMMENT '商品价格(单位:元)';
在 AskTable 中配置:
{
"pool": {
"min_size": 2,
"max_size": 10,
"connect_timeout": 10
}
}
生成 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"
}
-- 只允许特定 IP 访问
CREATE USER 'asktable_readonly'@'123.456.789.0' IDENTIFIED BY 'password';
GRANT SELECT ON demo_shop.* TO 'asktable_readonly'@'123.456.789.0';
-- 更改密码
ALTER USER 'asktable_readonly'@'%' IDENTIFIED BY 'new_password';
FLUSH PRIVILEGES;
恭喜!你已经成功接入了第一个数据源。
继续学习:
实践建议:
获取帮助:
相关阅读:
技术交流:
sidebar.noProgrammingNeeded
sidebar.startFreeTrial