扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
前提条件
创新互联公司服务项目包括麦盖提网站建设、麦盖提网站制作、麦盖提网页制作以及麦盖提网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,麦盖提网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到麦盖提省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
您需要在您RDS for MySQL所在的云账号下开通阿里云数据传输服务。并 点击此处
下载dts-ads-writer插件到您的一台服务器上并解压(需要该服务器可以访问互联网,建议使用阿里云ECS以最大限度保障可用性)。服务器上需要有Java
6或以上的运行环境(JRE/JDK)。
操作步骤
1. 在分析型数据库上创建目标表,数据更新类型为实时写入,字段名称和MySQL中的建议均相同;
2. 在阿里云数据传输的控制台上创建数据订阅通道,并记录这个通道的ID;
(见: ),
3. 配置dts-ads-writer/app.conf文件,配置方式如下:
所有配置均保存在app.conf中,运行前请保证配置正确;修改配置后,请重启writer
基本配置:
{
"dtsAccessId": "", // 拥有数据订阅通道的云账号的accessId, 必须配置
"dtsAccessKey": "", // 拥有数据订阅通道的云账号的accessKey, 必须配置
"dtsTunnelId": "", // 数据订阅通道的id, 必须配置; 注意是id,不是通道名称
"adsUserName": "", // 访问您的分析型数据库的用户名(accessId), 必须配置
"adsPassword": "", // 访问您的分析型数据库的密码(accessKey), 必须配置
"adsJdbcUrl": "", // 访问分析型数据库的jdbc连接串, 必须配置(格式jdbc:mysql://ip:port/dbname)
"tables": [
{
"source": {
"primaryKeys": [""] // 主键定义, 必须配置; 注意RDS和分析型数据库中的主键定义必须一致
"db": "", // 源头RDS的db名称, 必须配置
"table": "", // 源头RDS的table名称, 必须配置
"skipColumns": ["col1"] // 可选,若在此配置了RDS表某列名,则该列不会同步
},
"target": {
"table": "" // 分析型数据库表的table名称, 必须配置
},
"columnMapping": {
"": "" // rds表和ads表的列对应关系:key为rds的列名, value为分析型数据库的列名,选填,不填则按照列名一一对应
}
}
]
}
tables节点的配置示例,
表示rds_db库下的rds_table表对应ads_table表,并且rds_table表的col1列对应ads_table表的col1_ads列,
rds_table表的col2列对应ads_table表的col2_ads列
"tables": [
{
"source": {
"primaryKeys": [
"col1",
"col2"
],
"db": "rds_db",
"table": "rds_table"
},
"target": {
"table": "ads_table"
},
"columnMapping": {
"col1": "col1_ads",
"col2": "col2_ads"
}
}
]
注意事项:
1)RDS for MySQL表和分析型数据库中表的主键定义必须完全一致;如果不一致会出现数据不一致问题。如果需要调整RDS/分析型数据库表的主键,建议先停止writer进程;
2)一个插件进程中分析型数据库db只能是一个,由adsJdbcUrl指定;
3)一个插件进程只能对应一个数据订阅通道;如果更新通道中的订阅对象时,需要重启进程
4)RDS for MySQL中DDL操作不做同步处理;
5)更新app.conf需要重启插件进程才能生效;
6)如果工具出现bug或某种其它原因需要重新同步历史数据,只能回溯最近24小时的数据(在阿里云数据传输的控制台中修改消费位点);
7)插件的最大同步性能与运行插件的服务器的互联网带宽和磁盘IOPS成正比。
4. 运行dts-ads-writer/bin/startup.sh(sh bin/startup.sh);
5. 配置监控程序监控进程存活和日志中的常见错误码。
logs目录下的日志中的异常信息均以ErrorCode=XXXX ErrorMessage=XXXX形式给出,可以进行监控
根据无穷递缩等比数列的
所有各项之和的公式:
无穷递缩等比数列{an}中,
若a1=a,公比为q(lql1),
那么各项之和为
S=a/(1一q)!
所以有
1+1/2+1/4+……
=1/(1一1/2)=2。
把后缀为.sql的命令文件导入数据库 source d:/1.sql; 注意:要先选择一个数据库,要不不能导入的.
一、关键字执行顺序
1、查询中用到的关键词主要包含六个,并且他们的顺序依次为 :
select--from--where--group by--having--order by 其中select和from是必须的,其他关键词是可选的。
这六个关键词的执行顺序,与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行
from--where--group by--having--select--order by。
注意:虽然select在having后执行,但是mysql中仍然可以在having中使用select语句定义的别名。
原因分析:mysql在查询的时候会产生一个临时表,所有的字段名称(别名)在临时表中已经产生,产生了临时表之后才会进行having操作。也就是说mysql内部有一定的解析顺序,解析顺序select优先于having。在这里我个人认为是mysql可能没有将这一点做规范。Oracle中having无法使用select语句内的别名。
2、insert into 和replace into和merge into
insert into是mysql的基本插入语句。replace into 是mysql中的代替插入语句,可以理解为insert into的升级版。replace into在执行的时候,首先会根据指定的主键或者唯一索引判断当前表中是否存在指定的主键或索引,如果主键或唯一索引已经存在,则先将对应的索引的数据删除,然后在索引位置插入replace into中包含的数据。如果主键和唯一索引没有存在,则直接在索引位置插入replace into中包含的数据。merge into 是oracle数据库中的代替插入语句。实现方式和replace into类似。执行效率:如果指定索引位置没有数据,insert into和replace into执行效率相差无几,二者效率相同。如果指定位置索引已经存在,insert into语句不能正常执行,replace into语句可以正常执行。注意:虽然replace into比较好使用,但是也存在一定风险:replace每次要重新分配自增id;replace中执行delete时, 在有外键的情况下会很麻烦;如果delete时定义的有触发器, 则会被执行;副作用也会被传播到replica slave.推荐使用INSERT INTO … ON DUPLICATE KEY UPDATEON DUPLICATE KEY UPDATE是mysql特有的一个sql关键字,只能在mysql中使用。
在MySQL数据库中,如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句,而要插入的行与表中现有记录的惟一索引或主键中产生重复值,那么就会发生旧行的更新;如果插入的行数据与现有表中记录的唯一索引或者主键不重复,则执行新纪录插入操作。
比如有这样一张表:
create table func(id int primary key,count int,birthday date);
insert into func values(1,1,'1990-09-09');--插入一条数据
insert into func values(1,1,'1990-09-09') on duplicate key update count = count+1;--表中有数据,删除原表数据,将新数据插入。
提示两行受到影响,说明先执行的删除操作,然后插入新的数据。
观察到没有任何新数据插入,count字段被更新。(count字段更新是因为刚刚的插入语句中书写了update count = count+1;)
如果不希望任何字段更新,可以写成如下格式:
insert into func values(1,1,'1990-09-09') on duplicate key update count = values(count);--再次执行,没有新数据插入到数据库中。
二、mysql内置函数
内置函数众多,不需要每一个都掌握,熟练掌握几个在以后使用即可。可以查看mysql官方文档学习内置函数。
三、其它注意事项
1、在已经存在的表中添加外键。(仅作为了解内容)
alter table tb_name add constraint fk_name foreign key (tb_name.id) references tb_stu(id);
例如:alter table emp add constraint forkey foreign key(dept_id) references dept(id);
该语句是在 tb_name表上添加一个外键约束,引用 tb_stu的主键,fk_name是约束的名字。
删除约束:alter table tb_name drop constraint fk_name ;
2、外键的使用情景:
在不要求吞吐速度而对数据的正确性和安全性要求较高时,推荐使用外键。
如果面对高吞吐量,要求优先保证读取效率时,则不推荐使用外键。
3、删除的时候使用别名:
原句:delete from employee where id = 1;
别名:delete e from employee as e where id =1;
用shell脚本通过while循环批量生成mysql测试数据的方法。
1、很多时候需要在mysql表中插入大量测试数据,下面分享一个用shell脚本通过while循环批量生成mysql测试数据的方法,你只需要根据你自己的表结构来生成sql语句即可。
复制代码代码如下:
#!/bin/bash
i=1;
MAX_INSERT_ROW_COUNT=$1;
while [ $i -le $MAX_INSERT_ROW_COUNT ]
do
mysql -uroot -proot afs -e "insert into afs_test (name,age,createTime) values ('HELLO$i',$i % 99,NOW());"
d=$(date +%M-%d\ %H\:%m\:%S)
echo "INSERT HELLO $i @@ $d"
i=$(($i+1))
sleep 0.05
done
exit 0
2、假定上面的shell脚本保存为create-data.sh,可以通过下面的命令来生成数据:
复制代码代码如下:sh create-data.sh 10000。(参数10000是要生成的数据条数。)
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流