RDS最佳实践(三)—如何制定相关的流程来规范RDS的使用_MySQL
上一篇文章中,我们介绍了如何快速的把本地自建的数据库迁移入云,那是不是把数据库迁移到RDS后,用户就什么都不需要做了?比如RDS帮你的数据库做到了高可用,在主库出现down机后能够快速切换到备库,立刻恢复应用;每天会定时的备份数据和日志,如果出现误操作能够帮你恢复到任意时间点;如果担心黑客攻击或者sql注入漏洞,RDS能够帮助你进行sql注入的拦截;当数据库使用中出现bug时,后端有专业的源码和DBA团队帮助用户实例打上patch,让用户无后顾之忧;当实例的性能出现瓶颈的时候,可以进行快速的弹性升级,保证服务的正常运行等等。
可以看到RDS已经具备相当丰富的自动化数据库运维的功能,用户不用太关心后端数据库的运维,以前这些非常专业的DBA工作完完全全可以交由RDS系统来完成,那么还需要用户做什么,是不是不需要用户干预了?答案是需要的,在日常的工单问题发现:
一. 经常会发现由于自己的开发人员误操作导致用户数据被误删除,虽然RDS支持恢复到任意时间点,但毕竟需要时间去恢复,会造成对用户的影响;所以线上的操作务必谨慎,必须在测试环境中完全验证后才能到线上执行,同时需要必要的数据备份;
二.开发人员发布了一个新功能,但是新功能中的一条sql语句没有添加索引,导致了全表扫描,RDS的CPU,IO达到100%,影响了整个应用的响应时间;所以新发布的任何sql都必须进过严格的审核,添加上必要的索引;
三. 开发人员在业务高峰期对表进行一个表添加索引或者添加字段的操作(删除数据),导致该表的其他访问堵塞,影响前端应用;所以任何的线上操作都需要在业务的低峰期进行,生产变更必须严格控制在可允许的变更窗口内;
四.RDS实例由于时间到期后没有及时进行处理,导致实例被锁定或者释放,虽然最终数据可以恢复回来,但这种故障的发生往往令人心惊胆寒;
所以需要用户制定出合理的流程规范来使用RDS,比如设计开发过程中的数据库流程规范,线下测试环境与线上生产环境数据的导入导出流程规范,线上数据订正的流程规范,线上数据库操作(添加字段,添加索引)的流程规范,数据库上线下线的流程规范。
在阿里巴巴数据库技术团队,即使有了非常自动化的运维平台,上述的这些流程制定也是开发,测试,DBA都必须遵守的,就是因为有了上述的这些流程才避免了很多不必要的故障发生,大大提高了整个平台的稳定性,除此之外还制定了运维红线:
一.禁止在非变更窗口执行变更:
.所有的变更必须提前4小时提交申请,进过审批后才能执行操作;
.全网变更必须经过线下测试,线上小规模验证后,才能全网推送;
.重大变更(数据库停机,扩容,迁移)必须团队review;
.数据订正和数据提取必须经过团队leader审核通过后才能进行操作;
二.安全保密:
.禁止未经正式审批进行查阅,变更,传播,移动线上数据;
.禁止对无关人员提供系统登录和发布权限;
数据库开发规范:赶集网(国内互联网公司)的DBA 吴诗展把自己多年的数据库mysql运维开发检验总结了—MySQL数据库开发的三十六条军,对于很多的RDS用户来说同样是很受用的,包括了:基本军规,字段军规,索引军规,SQL类军规,约定类军规,在此也很感谢他能够把多年来的经验总结分享给众多的数据库用户,在这里也在着重强调一些比较重要的规范:
一.表主键的设置:自增主键是你的最佳选择
.在设计表的时候默认都添加一列无业务意义的自增id的主键:id bigint not null auto_increment;
.自增型主键以利于插入性能的提高
.自增型主键设计(int,bigint)可以降低二级索引的空间,提升二级索引的内存命中率;
.自增型的主键可以减小page的碎片,提升空间和内存的使用;
.无主键的表删除,更新在row模式的主从架构,会导致备库hang住;
可参考:mysql主键的缺少导致备库hang
二.引擎选择:INNODB 引擎是你的最佳选择
使用INNODB存储引擎还是Myisam存储引擎?
.RDS的内存配置innodb的innodb_buffer_pool_size,Myisam的key_cache配置32k;
.主机断电,crash后Myisam表容易出现索引坏叶,需要手工repair修复索引;
.Myisam存储引擎的表备份时候会被全局锁住,导致无法写入数据;
案例一:下面的这幅图片就是myisam引擎的表由于一个大查询堵塞了该表的其他更新:
案例二:.FEDERATED 存储引擎使用存在bug,会导致备份失败
error log: >> log scanned up to (867972807) 130616 00:00:58 innobackupex-1.5.1: Continuing after ibbackup has suspended 130616 00:00:58 innobackupex-1.5.1: Starting mysql with options: –defaults-file=’/etc/my3015.cnf’ –password=xxxxxxxx –user=’Xtrabak’ –host=’127.0.0.1′ –port=’3015′ –unbuffered – 130616 00:00:58 innobackupex-1.5.1: Connected to database with mysql child process (pid=31437) 130616 00:01:00 innobackupex-1.5.1: Starting to lock all tables… >> log scanned up to (867972807) innobackupex-1.5.1: Error: mysql child process has died: ERROR 1160 (08S01) at line 7: Got an error writing communication packets while waiting for reply to MySQL request: ‘FLUSH TABLES WITH READ LOCK;’ at /usr/bin/innobackupex-1.5.1 line 381. 2013-06-16 00:01:06 [info]: Xtrabackup error,you can get detail from Logfile. 2013-06-16 00:01:06 [info]: ====================================== All backup finished . |
三.索引设计误区:
误区案例一:对查询条件的每个字段建立单列索引
SQL查询:
SELECT count(*) FROM order o WHERE is_send=0 AND
o.order_status in (0,1) AND o.shipping_status = 0 AND
o.is_separate > 0 and o.is_yushou=0 and o.sd_id=23
and o.add_time>= ’1370246433′ and o.add_time
and o.jhd_id=0 group by o.order_id;
KEY:该表有近30个索引
PRIMARY KEY (order_id), UNIQUE KEY order_sn (order_sn), UNIQUE KEY deal_code (deal_code), KEY ind_user_id (user_id), KEY ind_shipping_id (shipping_id), KEY ind_pay_id (pay_id), KEY ind_agency_id (agency_id), KEY ind_extension_id (extension_id) , KEY ind_order_id (order_id), KEY ind_delivery_time (delivery_time) , KEY ind_invoice_no (invoice_no), KEY ind_user_nick (user_nick), KEY idx_cz_shipping_fee (cz_shipping_fee), KEY ind_mobile (mobile), KEY ind_order_info_sd (sd_id,is_send,add_time), KEY ind_order_info_status (shipping_status), KEY ind_order_pay_status (pay_status), KEY ind_order_is_yushou (is_yushou), KEY ind_order_dist_type (dist_type), KEY ind_order_jhd_id (jhd_id), KEY ind_order_is_send (is_send), KEY ind_order_ck_id(ck_id ), KEY ind_order_is_separate(is_separate), KEY ind_consignee (consignee), KEY ind_order_info_lylx (lylx,order_status,is_send); |
索引设计误区二:对查询的所有字段建立组合索引
09:44:03> show table status like ‘order’/G; *************************** 1. row *************************** Name: order Engine: InnoDB Version: 10 Row_format: Compact Rows: 5708209 Avg_row_length: 357 Data_length: 2042626048 Max_data_length: 0 Index_length: 9014607872 Data_free: 5242880 Auto_increment: NULL Create_time: 2013-04-09 22:56:57 Update_time: NULL Check_time: NULL Collation: utf8_bin Checksum: NULL Create_options: omment:订单表 该表的数据只有2G,但是索引却占用了9个G: |
KEY `idx_plt_taobao_order_dp_id` (`dp_id`,`customerno`,`created`,`endtime`,`pay_time`,`modified`,`consign_time`,`payment`,`status`,`type`,`total_fee`,`refund_fee`,`num`,`received_payment`,`trade_from`,`ccms_order_status`) KEY `idx_plt_taobao_order_created` (`created`,`customerno`,`endtime`,`pay_time`,`modified`,`consign_time`,`payment`,`status`,`type`,`total_fee`,`refund_fee`,`num`,`received_payment`,`trade_from`,`dp_id`,`ccms_order_status`) KEY `idx_plt_taobao_order_endtime` (`endtime`,`customerno`,`created`,`pay_time`,`modified`,`consign_time`,`payment`,`status`,`type`,`total_fee`,`refund_fee`,`num`,`received_payment`,`trade_from`,`dp_id`,`ccms_order_status`) KEY `idx_plt_taobao_order_pay_time` (`pay_time`,`customerno`,`created`,`endtime`,`modified`,`consign_time`,`payment`,`status`,`type`,`total_fee`,`refund_fee`,`num`,`received_payment`,`trade_from`,`dp_id`,`ccms_order_status`) |
希望这篇blog能够对你使用RDS有所帮助.

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Go 언어는 효율적이고 간결하며 배우기 쉬운 프로그래밍 언어입니다. 동시 프로그래밍과 네트워크 프로그래밍의 장점 때문에 개발자들이 선호합니다. 실제 개발에서 데이터베이스 작업은 필수적인 부분입니다. 이 기사에서는 Go 언어를 사용하여 데이터베이스 추가, 삭제, 수정 및 쿼리 작업을 구현하는 방법을 소개합니다. Go 언어에서는 일반적으로 사용되는 SQL 패키지, Gorm 등과 같은 타사 라이브러리를 사용하여 데이터베이스를 운영합니다. 여기서는 sql 패키지를 예로 들어 데이터베이스의 추가, 삭제, 수정 및 쿼리 작업을 구현하는 방법을 소개합니다. MySQL 데이터베이스를 사용하고 있다고 가정합니다.

Apple의 최신 iOS18, iPadOS18 및 macOS Sequoia 시스템 릴리스에는 사진 애플리케이션에 중요한 기능이 추가되었습니다. 이 기능은 사용자가 다양한 이유로 손실되거나 손상된 사진과 비디오를 쉽게 복구할 수 있도록 설계되었습니다. 새로운 기능에는 사진 앱의 도구 섹션에 '복구됨'이라는 앨범이 도입되었습니다. 이 앨범은 사용자가 기기에 사진 라이브러리에 포함되지 않은 사진이나 비디오를 가지고 있을 때 자동으로 나타납니다. "복구된" 앨범의 출현은 데이터베이스 손상으로 인해 손실된 사진과 비디오, 사진 라이브러리에 올바르게 저장되지 않은 카메라 응용 프로그램 또는 사진 라이브러리를 관리하는 타사 응용 프로그램에 대한 솔루션을 제공합니다. 사용자는 몇 가지 간단한 단계만 거치면 됩니다.

Hibernate 다형성 매핑은 상속된 클래스를 데이터베이스에 매핑할 수 있으며 다음 매핑 유형을 제공합니다. Join-subclass: 상위 클래스의 모든 열을 포함하여 하위 클래스에 대한 별도의 테이블을 생성합니다. 클래스별 테이블: 하위 클래스별 열만 포함하는 하위 클래스에 대한 별도의 테이블을 만듭니다. Union-subclass: Joined-subclass와 유사하지만 상위 클래스 테이블이 모든 하위 클래스 열을 통합합니다.

HTML은 데이터베이스를 직접 읽을 수 없지만 JavaScript 및 AJAX를 통해 읽을 수 있습니다. 단계에는 데이터베이스 연결 설정, 쿼리 보내기, 응답 처리 및 페이지 업데이트가 포함됩니다. 이 기사에서는 JavaScript, AJAX 및 PHP를 사용하여 MySQL 데이터베이스에서 데이터를 읽는 실제 예제를 제공하고 쿼리 결과를 HTML 페이지에 동적으로 표시하는 방법을 보여줍니다. 이 예제에서는 XMLHttpRequest를 사용하여 데이터베이스 연결을 설정하고 쿼리를 보내고 응답을 처리함으로써 페이지 요소에 데이터를 채우고 데이터베이스를 읽는 HTML 기능을 실현합니다.

MySQLi를 사용하여 PHP에서 데이터베이스 연결을 설정하는 방법: MySQLi 확장 포함(require_once) 연결 함수 생성(functionconnect_to_db) 연결 함수 호출($conn=connect_to_db()) 쿼리 실행($result=$conn->query()) 닫기 연결( $conn->close())

PHP에서 데이터베이스 연결 오류를 처리하려면 다음 단계를 사용할 수 있습니다. mysqli_connect_errno()를 사용하여 오류 코드를 얻습니다. 오류 메시지를 얻으려면 mysqli_connect_error()를 사용하십시오. 이러한 오류 메시지를 캡처하고 기록하면 데이터베이스 연결 문제를 쉽게 식별하고 해결할 수 있어 애플리케이션이 원활하게 실행될 수 있습니다.

Golang의 데이터베이스 콜백 기능을 사용하면 다음을 달성할 수 있습니다. 지정된 데이터베이스 작업이 완료된 후 사용자 정의 코드를 실행합니다. 추가 코드를 작성하지 않고도 별도의 함수를 통해 사용자 정의 동작을 추가할 수 있습니다. 삽입, 업데이트, 삭제, 쿼리 작업에 콜백 함수를 사용할 수 있습니다. 콜백 함수를 사용하려면 sql.Exec, sql.QueryRow, sql.Query 함수를 사용해야 합니다.

Go 표준 라이브러리 데이터베이스/sql 패키지를 통해 MySQL, PostgreSQL 또는 SQLite와 같은 원격 데이터베이스에 연결할 수 있습니다. 데이터베이스 연결 정보가 포함된 연결 문자열을 생성합니다. sql.Open() 함수를 사용하여 데이터베이스 연결을 엽니다. SQL 쿼리 및 삽입 작업과 같은 데이터베이스 작업을 수행합니다. 리소스를 해제하기 위해 defer를 사용하여 데이터베이스 연결을 닫습니다.
