
企业微信

飞书
选择您喜欢的方式加入群聊

扫码添加咨询专家
本文将手把手教你接入第一个 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;
恭喜!你已经成功接入了第一个数据源。
继续学习:
实践建议:
获取帮助:
相关阅读:
技术交流: