├── .github └── workflows │ └── gitbook-master.yml ├── .gitignore ├── .idea ├── markdown-navigator.xml └── vcs.xml ├── 0.overview ├── 0.0_overview.md ├── 0.1_dble_overview.md ├── 0.2_dble_enhance_MyCat.md ├── 0.3_dble_quick_start.md ├── 0.3_quick_start │ ├── 0.3.1_dble_quick_start_docker.md │ └── 0.3.2_dble_docker_compose.md ├── 0.4_sharding_brief_introduction.md ├── doc │ └── DBLE_enhance_for_MyCAT.pdf └── pic │ ├── architecture.PNG │ └── dble_IO_cn.png ├── 1.config_file ├── 1.00_config_file.md ├── 1.01_cluster.cnf.md ├── 1.02_bootstrap.cnf.md ├── 1.03_user.xml.md ├── 1.04_db.xml.md ├── 1.05_sharding.xml.md ├── 1.06_log4j2.xml.md ├── 1.07_global_sequence.md ├── 1.08_cache.md ├── 1.09_dble_route_function_spec.md ├── 1.10_version_change.md ├── 1.11_customized_alert.md ├── 1.11_customized_alert │ ├── MailAlert.java │ └── mailalert.jar ├── 1.12_customized_global_table_check.md ├── 1.12_customized_global_table_check │ └── CustomizeTest.java ├── 1.13_schema_default_sharding_table.md ├── 1.7_global_sequence │ ├── 1.7.1_MySQL-offset-setp.md │ ├── 1.7.2_timestamp.md │ ├── 1.7.3_distribute_timestamp.md │ └── 1.7.4_distribute_offset-step.md ├── 1.8_cache │ ├── 1.8.1_cache_setting.md │ └── 1.8.2_ehcache_setting.md └── pic │ ├── 1.1_stringhash.png │ ├── 3.20.07.0_config.png │ ├── add_library_global.png │ ├── add_to_library.png │ ├── alert.png │ ├── build.png │ ├── check_logic.png │ ├── create_packet.png │ ├── create_project_global.png │ ├── dble_update_config │ ├── dble_update_config_arm64 │ ├── function_code_global.png │ ├── function_loading.png │ ├── global_package.png │ ├── inheritance_and_imeplementation.png │ ├── intelliJ │ ├── addlib.png │ ├── artifacts.jpg │ ├── artifacts2.jpg │ ├── build.png │ ├── create.png │ └── lib.png │ ├── java_project_create.png │ ├── packet_detail.png │ └── routing_prototype.png ├── 2.Function ├── 2.000_overview.md ├── 2.001_dble_information │ └── 2.0.1.27_dble_config.md ├── 2.001_manager_dble_information.md ├── 2.01_manager_cmd.md ├── 2.02_global_sequence.md ├── 2.03_RW_Split.md ├── 2.04_hint.md ├── 2.05_distribute_transaction.md ├── 2.06_conns_pool.md ├── 2.07_memory_manager.md ├── 2.08_cluster.md ├── 2.09_Grpc_warning.md ├── 2.10_table_meta.md ├── 2.10_table_meta │ ├── 2.10.1_Meta_init.md │ ├── 2.10.2_Meta_change.md │ ├── 2.10.3_consistency_check.md │ ├── 2.10.4_View_Meta.md │ └── pic │ │ └── 2.10.3_consistency_check.png ├── 2.11_statistics_manager.md ├── 2.11_statistics_manager │ ├── 2.11.1_condition_stat.md │ ├── 2.11.2_table_stat.md │ ├── 2.11.3_user_stat.md │ ├── 2.11.4_cmd_stat.md │ ├── 2.11.5_heartbeat_stat.md │ ├── 2.11.6_net_io_stat.md │ └── 2.11.7_sql_stat.md ├── 2.12_failover.md ├── 2.13_conns_check.md ├── 2.14_ER_Sharding.md ├── 2.15_global_table.md ├── 2.16_cache.md ├── 2.17_explain.md ├── 2.18_performance_observation.md ├── 2.19_reload_diff.md ├── 2.1_manager_cmd │ ├── 2.1.01_select.md │ ├── 2.1.02_set.md │ ├── 2.1.03_show.md │ ├── 2.1.04_switch.md │ ├── 2.1.05_kill.md │ ├── 2.1.06_stop.md │ ├── 2.1.07_reload.md │ ├── 2.1.09_offline.md │ ├── 2.1.10_online.md │ ├── 2.1.13_dryrun.md │ ├── 2.1.14_pause_resume.md │ ├── 2.1.15_slow_query.md │ ├── 2.1.16_database.md │ ├── 2.1.17_check_meta_data.md │ ├── 2.1.18_release.md │ ├── 2.1.19_split.md │ ├── 2.1.20_flow_control.md │ ├── 2.1.21_fresh_conn.md │ ├── 2.1.22_detach_cluster.md │ └── 2.1.23_thread_cmd.md ├── 2.20_slow_query_log.md ├── 2.21_query_trace.md ├── 2.22_kill_ddl_lock.md ├── 2.23_outerHa_linkage.md ├── 2.23_outerHa_linkage │ ├── 2.23.1_outerHa_linkage_overview.md │ ├── 2.23.2_command_usage.md │ ├── 2.23.3_Logical_detail.md │ ├── 2.23.4_mha_sample.md │ └── pic │ │ ├── 2.23.2_disable_cluster.png │ │ ├── 2.23.2_disable_single.png │ │ ├── 2.23.2_enable_cluster.png │ │ ├── 2.23.2_enable_single.png │ │ ├── 2.23.2_switch_cluster.png │ │ ├── 2.23.2_switch_single.png │ │ ├── 2.23.4_container_overview.png │ │ ├── 2.23.4_service_overview.png │ │ └── 2.23_overview.png ├── 2.24_timeout_control.md ├── 2.25_flow_control.md ├── 2.26_cap_client_found_rows.md ├── 2.27_general_log.md ├── 2.28_sql_statistic.md ├── 2.29_load_data.md ├── 2.2_global_sequence │ ├── 2.2.1_MySQL-offset-setp.md │ ├── 2.2.2_timestamp.md │ ├── 2.2.3_distribute_timestamp.md │ └── 2.2.4_distribute_offset-step.md ├── 2.30_insubquery_transform_to_join.md ├── 2.31_ddl_log.md ├── 2.32_analysis_user.md ├── 2.33_execute_plan_hint │ └── overview.md ├── 2.34_security │ ├── 2.34.1_generate_certificate.md │ ├── 2.34.2_configure_SSL.md │ └── overview.md ├── 2.35_memory_buffer_monitor.md ├── 2.36_delay_detection.md ├── 2.37_sql_dump_log.md ├── 2.38_tcp_parameter.md ├── 2.39_HTAP.md ├── 2.40_thread_cmd.md ├── 2.5_distribute_transaction │ ├── 2.5.1_XA_trans_overview.md │ ├── 2.5.2_XA_trans_commit&rollback.md │ ├── 2.5.3_XA_trans_make_up.md │ ├── 2.5.4_XA_trans_records.md │ ├── 2.5.5_normal_trans_overview.md │ ├── 2.5.6_XA_trans_residual_xid.md │ └── pic │ │ ├── 2.5.1.png │ │ ├── 2.5.2.png │ │ ├── 2.5.3.png │ │ ├── 2.5.4.png │ │ └── 2.5.5.png └── pic │ ├── 2.10.3_consistency_check.png │ ├── 2.14_er_table.png │ ├── 2.14_er_table_split.png │ ├── 2.15_global_table.png │ ├── 2.18_performan_result.png │ ├── 2.18_performance_checkpoint.png │ ├── 2.18_show_thread_used_result.png │ ├── 2.20_slow_log_checkpoint.png │ ├── 2.23_front_back_connection.png │ ├── 2.25_flow_control_load.png │ ├── 2.25_flow_control_select.png │ ├── 2.31_ddl2.png │ ├── 2.3_localread.png │ ├── 2.3_rwSplitMode.png │ ├── 2.6_1.png │ ├── 2.6_2.png │ ├── 2.7_bufferpage_structure.png │ ├── 2.7_bufferpool_structure.png │ ├── 2.7_memory_structure.png │ ├── 2.8_binlog.png │ ├── 2.8_ddl.png │ ├── 2.8_init.png │ ├── 2.8_legend.png │ ├── 2.8_reload.png │ └── 2.8_view.png ├── 3.SQL_Syntax ├── 3.0_overview.md ├── 3.10_func_and_operators.md ├── 3.11_Export_and_Import.md ├── 3.1_DDL.md ├── 3.1_DDL │ ├── 3.1.1_DDL&Table_Syntax.md │ ├── 3.1.2_DDL&View_Syntax.md │ ├── 3.1.3_DDL&Index_Syntax.md │ ├── 3.1.4_DDL_Penetrate.md │ ├── 3.1.5_DDL&Database_Syntax.md │ └── 3.1.6_DDL&online_ddl.md ├── 3.2_DML.md ├── 3.2_DML │ ├── 3.2.01_INSERT.md │ ├── 3.2.02_REPLACE.md │ ├── 3.2.03_DELETE.md │ ├── 3.2.04_UPDATE.md │ ├── 3.2.05_SELECT.md │ ├── 3.2.06_SELECT_JOIN_syntax.md │ ├── 3.2.07_UNION_Syntax.md │ ├── 3.2.08_Subquery_Syntax.md │ ├── 3.2.09_LOAD_DATA.md │ └── 3.2.10_Unsupport_Syntax.md ├── 3.3_Prepared_SQL_Syntax.md ├── 3.4_Transactional_and_Locking_Statements.md ├── 3.4_Transactional_and_Locking_Statements │ ├── 3.4.1_start_trans.md │ ├── 3.4.2_Implicit_commit.md │ ├── 3.4.3_savepoint_syntax.md │ ├── 3.4.4_Lock&unlock.md │ ├── 3.4.5_SET_TRANSACTION_Syntax.md │ ├── 3.4.6_XA_trans_syntax.md │ └── 3.4.7_other.md ├── 3.5_DAL.md ├── 3.5_DAL │ ├── 3.5.1_SET.md │ ├── 3.5.2_SHOW.md │ ├── 3.5.3_KILL.md │ └── 3.5.4_Unsupport_Syntax.md ├── 3.6_procedure_support.md ├── 3.7_Utility_Statements.md ├── 3.8_Hint.md └── 3.9_Other_unsupport.md ├── 4.Protocol ├── 4.0_overview.md ├── 4.1_Packet.md ├── 4.2_Connecting.md ├── 4.3_Text_Protocol.md ├── 4.4_Binary_Protocol.md ├── 4.5_Server_Response_Packets.md └── pic │ ├── 4.4.1.png │ ├── 4.4.2.png │ ├── 4.4.3.png │ └── 4.4.4.png ├── 5.Limit ├── 5.0_overview.md ├── 5.1_druid_limit.md └── 5.2_other_limit.md ├── 6.Differernce_from_MySQL_Server ├── 6.0_overview.md ├── 6.1_need_rollback.md ├── 6.2_insert_sequence.md ├── 6.3_add_show_all_tables.md ├── 6.4_remove_message.md └── 6.5_about_information_schema.md ├── 7.Developer_Notice ├── 7.0_overview.md ├── 7.1_SQL_develop_rule.md ├── 7.2_Demo_for_connect_dble.md └── 7.3_Other_Notice.md ├── 8.Configuration_samples ├── 8.0_overview.md ├── 8.1_timestamp_sequence_table.md └── 8.2_MySQL-offset-step_sequence_table.md ├── 9.Sysbench_samples ├── 9.0_overview.md ├── 9.1_env.md ├── 9.2_conf.md └── 9.3_use_sysbench.md ├── A.Faq ├── A_overview.md ├── ErrorCode │ ├── A_overview1.md │ └── Content │ │ ├── Can'tGetVariablesFromShardingNode.md │ │ ├── MaxConnections.md │ │ ├── NestLoopParametersLeadToTemptableException.md │ │ ├── OutOfMemoryError.md │ │ ├── PortAlreadyInUse1984.md │ │ ├── ShardingColumnCannotBeNull.md │ │ └── TheProblemOfHint.md ├── Internals │ ├── A_overview2.md │ └── Content │ │ ├── HashAndConsistentHashingAndJumpstringhash.md │ │ └── UseExplainToTraceGroupBy.md └── Usage │ ├── A_overview3.md │ └── Content │ └── ToBeContinued2.md ├── Gitbook_README.md ├── LICENSE ├── Makefile ├── QR_code.png ├── README.md ├── SUMMARY.md ├── book.json ├── deploy.sh ├── pdf.css └── website.css /.github/workflows/gitbook-master.yml: -------------------------------------------------------------------------------- 1 | name: 'Gitbook-Master' 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | jobs: 9 | build: 10 | name: publish gitbook 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v4 14 | - uses: yanhuqing666/gitbook-action@1.2.5 # https://github.com/ZanderZhao/gitbook-action/releases 15 | with: 16 | token: ${{ secrets.PUBLISH_TOKEN }} 17 | time_zone: Asia/Shanghai # set time zone 18 | source_branch: master # clone source master 19 | publish_push_force: true 20 | publish_remove_last_build: false 21 | gitbook_pdf: true 22 | gitbook_pdf_dir: / 23 | gitbook_pdf_name: dble-manual 24 | #font_install: sudo apt-get install fonts-noto-cjk ttf-mscorefonts-installer 25 | #prepare_install: bash chj-fonts.sh #sudo add-apt-repository universe && sudo apt update && sudo apt-get install calibre fonts-arphic-gbsn00lp 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### Eclipse template 2 | *.pydevproject 3 | .metadata 4 | .gradle 5 | /bin/ 6 | /tmp/ 7 | *.tmp 8 | *.bak 9 | *.swp 10 | *~.nib 11 | local.properties 12 | .settings/ 13 | .loadpath 14 | 15 | # Eclipse Core 16 | .project 17 | 18 | # External tool builders 19 | .externalToolBuilders/ 20 | 21 | # Locally stored "Eclipse launch configurations" 22 | *.launch 23 | 24 | # CDT-specific 25 | .cproject 26 | 27 | # JDT-specific (Eclipse Java Development Tools) 28 | .classpath 29 | 30 | # Java annotation processor (APT) 31 | .factorypath 32 | 33 | # PDT-specific 34 | .buildpath 35 | 36 | # sbteclipse plugin 37 | .target 38 | 39 | # TeXlipse plugin 40 | .texlipse 41 | 42 | 43 | ### JetBrains template 44 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion 45 | 46 | *.iml 47 | 48 | ## Directory-based project format: 49 | .idea/ 50 | # if you remove the above rule, at least ignore the following: 51 | 52 | # User-specific stuff: 53 | # .idea/workspace.xml 54 | # .idea/tasks.xml 55 | # .idea/dictionaries 56 | 57 | # Sensitive or high-churn files: 58 | # .idea/dataSources.ids 59 | # .idea/dataSources.xml 60 | # .idea/sqlDataSources.xml 61 | # .idea/dynamic.xml 62 | # .idea/uiDesigner.xml 63 | 64 | # Gradle: 65 | # .idea/gradle.xml 66 | # .idea/libraries 67 | 68 | # Mongo Explorer plugin: 69 | # .idea/mongoSettings.xml 70 | 71 | ## File-based project format: 72 | *.ipr 73 | *.iws 74 | 75 | ## Plugin-specific files: 76 | 77 | # IntelliJ 78 | /out/ 79 | .idea/ 80 | 81 | # mpeltonen/sbt-idea plugin 82 | .idea_modules/ 83 | 84 | # JIRA plugin 85 | atlassian-ide-plugin.xml 86 | 87 | # Crashlytics plugin (for Android Studio and IntelliJ) 88 | com_crashlytics_export_strings.xml 89 | crashlytics.properties 90 | crashlytics-build.properties 91 | 92 | 93 | ### Java template 94 | *.class 95 | 96 | # Mobile Tools for Java (J2ME) 97 | .mtj.tmp/ 98 | 99 | # Package Files # 100 | *.war 101 | *.ear 102 | 103 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 104 | hs_err_pid* 105 | 106 | 107 | /project/project/ 108 | /project/target/ 109 | /project/activator-* 110 | /RUNNING_PID 111 | .DS_Store 112 | /target/ 113 | /tmlogs/ 114 | /txlogs/ 115 | /viewConf/ 116 | version.txt 117 | copyResources.bat 118 | dependency-reduced-pom.xml 119 | checkstyle-result.out 120 | 121 | # gitbook 122 | _book/ 123 | node_modules/ 124 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /0.overview/0.0_overview.md: -------------------------------------------------------------------------------- 1 | # 0 概览 2 | * [0.1 dble 简介与整体架构](0.1_dble_overview.md) 3 | * [0.2 dble对MyCat做的增强](0.2_dble_enhance_MyCat.md) 4 | * [0.3 快速开始](0.3_dble_quick_start.md) 5 | * [0.3.1 docker镜像快速开始](0.3_quick_start/0.3.1_dble_quick_start_docker.md) 6 | * [0.3.2 docker-compose快速开始](0.3_quick_start/0.3.2_dble_docker_compose.md) 7 | * [0.4 数据拆分简介](0.4_sharding_brief_introduction.md) 8 | -------------------------------------------------------------------------------- /0.overview/0.1_dble_overview.md: -------------------------------------------------------------------------------- 1 | ## 0.1 dble 简介与整体架构 2 | ### 0.1.1 dble简介 3 | dble是[上海爱可生信息技术股份有限公司](http://www.actionsky.com/)基于MySQL的高可扩展性的分布式中间件,存在以下几个优势特性: 4 | 5 | + **数据水平拆分** 随着业务的发展,您可以使用dble来替换原始的单个MySQL实例。 6 | 7 | + **兼容MySQL** 与MySQL协议兼容,在大多数情况下,您可以用它替换MySQL来为你的应用程序提供新的存储,而无需更改任何代码。 8 | 9 | + **高可用性** dble服务器可以用作集群,业务不会受到单节点故障的影响。 10 | 11 | + **SQL支持** 支持SQL 92标准和MySQL方言。我们支持复杂的SQL查询,如group by,order by,distinct,join,union,sub-query等等。 12 | 13 | + **复杂查询优化** 优化复杂查询,包括但不限于全局表连接分片表,ER关系表,子查询,简化选择项等。 14 | 15 | + **分布式事务支持** 使用两阶段提交的分布式事务。您可以为了性能选择普通模式或者为了数据安全采用XA模式。当然,XA模式依赖于MySQL-5.7的XA Transaction,MySQL节点的高可用性和数据的可靠性。 16 | 17 | ### 0.1.2 dble由来 18 | 19 | + dble 是基于开源项目MyCat的,在此对于MyCat的贡献者们致以由衷的感谢。 20 | + 对我们来说,专注于MySQL是一个更好的选择。 所以我们取消了对其他数据库的支持,对兼容性,复杂查询和分布式事务的行为进行了深入的改进/优化。 当然,还修复了一些bugs。详情可见[dble对MyCat做的改进](0.2_dble_enhance_MyCat.md) 21 | 22 | ### 0.1.3 dble内部架构 23 | ![](pic/architecture.PNG) 24 | 25 | 26 | -------------------------------------------------------------------------------- /0.overview/0.3_dble_quick_start.md: -------------------------------------------------------------------------------- 1 | ## 0.3 快速开始 2 | ### 0.3.0.1 关于本节 3 | + 本节内容为您介绍如何使用dble安装包快速部署并启动一个dble服务,并简单了解dble的使用和管理 4 | 5 | ### 0.3.0.2 安装准备 6 | 以下部分将被需要作为dble启动的基础支撑 7 | + 两个启动的MySQL实例 8 | dble是通过连接mysql数据库实例来进行数据的存储,所以请至少准备两个正在运行的mysql实例, 9 | 假设您的机器上存在两个MySQL实例: 10 | A:$url=ip1:3306,$user=test,$password=testPsw 11 | B:$url=ip2:3306,$user=test,$password=testPsw 12 | 请正确配置/etc/hosts,保证此MySQL实例可以正确访问,否则之后可能会报错 "NO ROUTE TO HOST"。 13 | 14 | + JVM环境 15 | dble是使用java开发的,所以需要启动dble您先需要在机器上安装java版本1.8或以上,并且确保JAVA_HOME参数被正确的设置 16 | 17 | ### 0.3.0.3 下载并安装 18 | + 通过此链接( https://github.com/actiontech/dble/releases )下载最新版本的安装包 19 | + 解压并安装dble到指定文件夹中 20 | ``` 21 | mkdir -p $working_dir 22 | cd $working_dir 23 | tar -xvf actiontech-dble-$version.tar.gz 24 | cd $working_dir/dble/conf 25 | mv cluster_template.cnf cluster.cnf 26 | mv bootstrap_template.cnf bootstrap.cnf 27 | mv db_template.xml db.xml 28 | mv user_template.xml user.xml 29 | mv sharding_template.xml sharding.xml 30 | ``` 31 | 32 | ### 0.3.0.4 dble的初始化配置 33 | + 修改db.xml,找到其中的 instanceM1 和 instanceM2,将数据库信息替换成已经安装启动的 MySQL 实例: 34 | 35 | ``` 36 | 38 | 39 | 41 | ``` 42 | 43 | ### 0.3.0.5 启动并连接 44 | + 启动命令 45 | 46 | ``` 47 | cd $working_dir/dble 48 | bin/dble start 49 | ``` 50 | 51 | + 如果启动失败请使用此命令查看失败的详细原因 52 | tail -f logs/wrapper.log 53 | 54 | + 使用mysql客户端直接连接dble管理端口,默认密码654321 55 | mysql -p -P9066 -h 127.0.0.1 -u man1 56 | + 您可以使用mysql一样的方式执行以下语句用于在实例上建立虚拟结点对应的schema 57 | 58 | 59 | ``` 60 | create database @@shardingnode='dn$1-6'; 61 | 62 | ``` 63 | 64 | 另外此端口还可以执行一些其他命令 65 | 66 | + 使用mysql客户端直接连接dble服务,默认密码123456 67 | mysql -p -P8066 -h 127.0.0.1 -u root 68 | + 您可以使用mysql一样的方式执行以下语句 69 | 70 | ``` 71 | use testdb; 72 | drop table if exists tb_enum_sharding; 73 | create table if not exists tb_enum_sharding ( 74 | id int not null, 75 | code int not null, 76 | content varchar(250) not null, 77 | primary key(id) 78 | )engine=innodb charset=utf8; 79 | insert into tb_enum_sharding values(1,10000,'1'),(2,10010,'2'),(3,10000,'3'),(4,10010,'4'); 80 | ``` 81 | 82 | 83 | -------------------------------------------------------------------------------- /0.overview/0.4_sharding_brief_introduction.md: -------------------------------------------------------------------------------- 1 | ## 0.4 数据拆分简介 2 | ### 0.4.1 数据拆分简介 3 | + 在dble中将表格按照数据分片的大致方式将表格的归为三个种类 4 | - 全局表:设置为全局表的表格将会在每个mysql节点上存在一个实体,并且在每个表格实体里面存放的都是全量的数据,一般用作字典表之类的数据量小、和多表关联或者是作为数据字典的表格。 5 | - 拆分表:设置为拆分表的表格会根据具体选择的拆分算法类型将其中的数据按照一定的规则分别存放到不同的mysql节点中去,每个节点存放一部分的数据。一般用以存放超大数据量的业务类表格,通过对于业务类表格的水平数据拆分实现性能的优化。 6 | - 非拆分表:设置为非拆分表的表格会在指定的mysql节点上单独存在一个表格实体,在此表格中存放全量数据。一般用于存放数据压力不大的业务类表格,类似冷门功能的业务数据表。 7 | 8 | ### 0.4.2 规划拆分方案 9 | + 系统开发之前,应该对业务特点进行深度分析,对数据规模进行较准确的评估,根据表的数据量、数据特点和表与表之间的关系,决定哪些表需要分片。数据节点的数量应该根据数据量和访问性能要求合理配置,过多的节点数量不仅浪费资源,而且增加运维复杂度,有时不仅不能提升性能,还会降低性能。 10 | + 对于小表(数据量不大,如千万以下),尽量不要配置成拆分表。如果表比较独立,与其他的表基本上不进行join运算,可以作为非拆分表处理,性能不能满足要求的时候可以通过配置读写分离机制来提高性能。如果需要与拆分表进行join运算,可以配置成全局表。 11 | + 关于每个实例的规格,选择的根据有两个因素: 12 | - 需要存储的最大磁盘空间,需要通过拆分算法计算,根据存储数据量最大的节点来计算,并预估未来2到3年的数据增长; 13 | - 估算一个实例需要的最大 QPS和TPS,要根据最慢的节点估算。 14 | + QPS、TPS与实际的SQL语句、数据量、数据结构和数据节点的规格有关,根据经验来估计的话,很可能偏差较大。系统建设之前,应该配置同等或者接近的环境,进行针对性的性能测试,从而做出准确的判断。 15 | 16 | ### 0.4.3 数据拆分表格的配置方法 17 | + 数据拆分配置包括节点配置和拆分规则配置。节点配置决定了数据的物理存储方式,由主机和节点组成,主机代表具体的数据库实例,节点代表实例中的数据库。拆分规则决定了数据在不同的分区上读写的规则,由拆分算法和应用拆分算法的逻辑库、表、字段组成。 18 | + 数据写入时,系统对指定的字段值应用拆分算法得到目标节点,然后将数据写入目标节点。数据读取时,系统对查询条件应用拆分算法得到数据源节点,从源节点获取数据,在中间层进行结果合并之后返回请求方,对于不同的查询条件,源节点可能有一个或多个。 19 | 20 | -------------------------------------------------------------------------------- /0.overview/doc/DBLE_enhance_for_MyCAT.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/0.overview/doc/DBLE_enhance_for_MyCAT.pdf -------------------------------------------------------------------------------- /0.overview/pic/architecture.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/0.overview/pic/architecture.PNG -------------------------------------------------------------------------------- /0.overview/pic/dble_IO_cn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/0.overview/pic/dble_IO_cn.png -------------------------------------------------------------------------------- /1.config_file/1.00_config_file.md: -------------------------------------------------------------------------------- 1 | # 1.dble配置文件基础 2 | + 配置文档列表以及相关对应功能 3 | - [cluster.cnf](1.01_cluster.cnf.md):集群参数配置 4 | - [bootstrap.cnf](1.02_bootstrap.cnf.md):实例参数配置,包括JVM启动参数,dble性能,定时任务,端口等 5 | - [user.xml](1.03_user.xml.md):dble 用户配置 6 | - [db.xml](1.04_db.xml.md):数据库相关配置 7 | - [sharding.xml](1.05_sharding.xml.md):数据拆分相关配置 8 | - [log4j.xml](1.06_log4j2.xml.md):log4j2.xml,配置日志参数 9 | - [全局序列](1.07_global_sequence.md):全局序列相关配置 10 | - [cache配置](1.08_cache.md):配置缓存参数 11 | - [自定义拆分算法](1.09_dble_route_function_spec.md) 12 | - [自定义告警](1.11_customized_alert.md) 13 | - [自定义全局表一致性检查](1.12_customized_global_table_check.md) 14 | - [Schema下默认拆分表](1.13_schema_default_sharding_table.md) 15 | + 重要日志及文件: 16 | - /logs/wrapper.log:启动日志,如果dble启动失败,将会有日志出现在这个文件中 17 | - /logs/dble.log:dble日志,日志记录并反馈dble执行过程中的重要信息 18 | + 配置文件变更记录: 19 | - [配置文件变更记录](1.10_version_change.md) 20 | 21 | dble 在3.20.07.0 版本做了配置的重构。历史变更请参考[2.20.04.0的变更](https://github.com/actiontech/dble-docs-cn/blob/2.20.04.1/tag/1.config_file/1.10_version_change.md) 22 | # 2. 配置升级 23 | 可以通过升级工具dble_update_config将配置从2.20.04.0 升级到3.20.07.0,如果是更早版本,建议先升级到2.20.04.0 24 | 25 | 升级工具下载地址: 26 | * AMD架构——[dble_update_config](pic/dble_update_config) 27 | * ARM架构——[dble_update_config_arm64](pic/dble_update_config_arm64) 28 | 29 | 升级工具用法: 30 | 31 | ``` 32 | dble_update_config/dble_update_config_arm64 [-i=read_dir] [-o=write_dir] [-p=rootPath] 33 | ``` 34 | read_dir/write_dir: 如果不指定,缺省值为当前目录,建议指定或者提前备份配置 35 | rootPath:如果集群模式是zk, 那么缺省值为 `/dble`, 如果集群模式是ucore, 缺省值为`universe/dble` 36 | 37 | 工具将会读取文件: 38 | myid.properties 39 | wrapper.conf 40 | server.xml 41 | schema.xml 42 | rule.xml 43 | log4j2.xml 44 | cacheservice.properties(option) 45 | sequence_distributed_conf.properties for type3 (option) 46 | sequence_time_conf.properties for type2 (option) 47 | 48 | 然后写出文件: 49 | cluster.cnf 50 | bootstrap.cnf 51 | user.xml 52 | db.xml 53 | sharding.xml 54 | log4j2.xml 55 | cacheservice.properties(option) 56 | 57 | 58 | # 3. 重构后的配置概览图: 59 | ![配置概览图](pic/3.20.07.0_config.png) 60 | -------------------------------------------------------------------------------- /1.config_file/1.07_global_sequence.md: -------------------------------------------------------------------------------- 1 | ## 1.7 全局序列 2 | 在分库分表的情况下,数据库自增主键无法保证自增主键的全局唯一。为此,dble提供了全局序列,并且针对不同应用场景提供了多种实现方式。 3 | 虽然提供了多种方式,但在生产环境不建议修改,因为它的各个值之间生成的序列是不兼容的,修改可能会破坏序列的唯一性。 4 | 要应用全局序列,首先需要在cluster.cnf 中配置: 5 | ``` 6 | sequenceHandlerType=n 7 | ``` 8 | 9 | 10 | 根据sequenceHandlerType的类型配置具体的实现: 11 | 12 | * 1:[MySQL offset-step方式](1.7_global_sequence/1.7.1_MySQL-offset-setp.md) 13 | * 2:[时间戳方式(类Snowflake)](1.7_global_sequence/1.7.2_timestamp.md) 14 | * 3:[分布式时间戳方式(类Snowflake)](1.7_global_sequence/1.7.3_distribute_timestamp.md) 15 | * 4:[分布式offset-step方式](1.7_global_sequence/1.7.4_distribute_offset-step.md) 16 | 17 | **其次**,使用全局序列的表要在sharding.xml中配置表格并指定其自增列。 18 | **自增列的指定逻辑:** 以显式声明的以incrementColumn中的指定为准 19 | 20 | ``` 21 | //有显式指定incrementColumn=pid,则pid作为自增列 22 | 23 | ``` 24 | 配置之后的使用示例: 25 | ``` 26 | insert into table1(name) values('test'); 27 | insert into table1 set name = 'test'; 28 | ``` 29 | 30 | 每一个全局序列的具体实现配置将在各个小节进行详细说明;其功能将在[2.2 全局序列](../2.Function/2.02_global_sequence.md)进行详细描述。 31 | 32 | **与MYSQL差异** 33 | 在MySQL中要求自增列必须含有唯一键,在dble中对于表格的自增列的唯一属性不做要求,但是在dble进行插入数据操作的时候不允许用户手动插入自增列的数值,自增列只能由dble自己生成的ID进行填充 34 | 并且存在以下情形和mysql的行为不一致 35 | ``` 36 | table1拥有列aid,bid,cid,did 其中bid为在dble中的自增列 37 | insert into table1 values(1,2,3) 38 | 和以下sql的效果相等 39 | insert into table1 set aid = 1,cid = 2,did = 3 40 | ``` 41 | 42 | **特别提醒** 43 | 在dble中全局序列只在生成的时候确保其唯一性,在之后的过程中用户被允许使用update或者replace语句进行更新自增字段(特例:自增字段同时也是分片字段是除外)。 44 | 这给予用户提供了充足的修改空间但同时要求用户在更新自增字段的时候有足够的谨慎和了解 -------------------------------------------------------------------------------- /1.config_file/1.08_cache.md: -------------------------------------------------------------------------------- 1 | ## 1.8 cache配置 2 | 3 | * [1.8.1 cache配置](1.8_cache/1.8.1_cache_setting.md) 4 | * [1.8.2 ehcache配置](1.8_cache/1.8.2_ehcache_setting.md) 5 | 6 | -------------------------------------------------------------------------------- /1.config_file/1.11_customized_alert/mailalert.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/1.11_customized_alert/mailalert.jar -------------------------------------------------------------------------------- /1.config_file/1.12_customized_global_table_check/CustomizeTest.java: -------------------------------------------------------------------------------- 1 | import com.actiontech.dble.backend.datasource.check.AbstractConsistencyChecker; 2 | import com.actiontech.dble.sqlengine.SQLQueryResult; 3 | 4 | import java.util.List; 5 | import java.util.Map; 6 | 7 | public class CustomizeTest extends AbstractConsistencyChecker { 8 | 9 | 10 | @Override 11 | public String[] getFetchCols() { 12 | return new String[]{"Checksum"}; 13 | } 14 | 15 | @Override 16 | public String getCountSQL(String dbName, String tName) { 17 | return "checksum table " + tName; 18 | } 19 | 20 | @Override 21 | public boolean resultEquals(SQLQueryResult>> or, SQLQueryResult>> cr) { 22 | Map oresult = or.getResult().get(0); 23 | Map cresult = cr.getResult().get(0); 24 | return (oresult.get("Checksum") == null && cresult.get("Checksum") == null) || 25 | (oresult.get("Checksum") != null && cresult.get("Checksum") != null && 26 | oresult.get("Checksum").equals(cresult.get("Checksum"))); 27 | } 28 | 29 | @Override 30 | public void failResponse(List>>> res) { 31 | String errorMsg = "Global Consistency Check fail for table :" + schema + "-" + tableName; 32 | System.out.println(errorMsg); 33 | for (SQLQueryResult>> r : res) { 34 | System.out.println("Checksum is : " + r.getResult().get(0).get("Checksum")); 35 | } 36 | } 37 | 38 | @Override 39 | public void resultResponse(List>>> elist) { 40 | String tableId = schema + "." + tableName; 41 | 42 | if (elist.size() == 0) { 43 | System.out.println("Global Consistency Check success for table :" + schema + "-" + tableName); 44 | } else { 45 | System.out.println("Global Consistency Check fail for table :" + schema + "-" + tableName); 46 | StringBuilder sb = new StringBuilder("Error when check Global Consistency, Table "); 47 | sb.append(tableName).append(" shardingNode "); 48 | for (SQLQueryResult>> r : elist) { 49 | System.out.println("error node is : " + r.getTableName() + "-" + r.getShardingNode()); 50 | sb.append(r.getShardingNode()).append(","); 51 | } 52 | sb.setLength(sb.length() - 1); 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /1.config_file/1.7_global_sequence/1.7.2_timestamp.md: -------------------------------------------------------------------------------- 1 | ### 1.7.2 时间戳方式 2 | 时间戳方式由bootstrap.cnf 和cluster.cnf文件进行配置。具体配置如下: 3 | 4 | **bootstrap.cnf的instanceId**:指定instance id值, 必须为[0,1023]之间的整数。 5 | 6 | **cluster.cnf的sequenceStartTime**:指定开始时间戳,格式必须为 YYYY-MM-dd HH:mm:ss,默认开始时间 2010-10-04 09:42:54。 7 | 8 | 注意事项:**bootstrap.cnf的instanceId**的配置必须使该dble实例在dble集群中唯一。 9 | 另外,使用这种方式需要对应字段为bigint来保证63位 10 | 11 | #### 配置示例 12 | 见[时间戳方式全局序列的配置](../../8.Configuration_samples/8.1_timestamp_sequence_table.md) 13 | 14 | -------------------------------------------------------------------------------- /1.config_file/1.7_global_sequence/1.7.3_distribute_timestamp.md: -------------------------------------------------------------------------------- 1 | ### 1.7.3 分布式时间戳方式 2 | 分布式时间戳方式由由bootstrap.cnf 和cluster.cnf文件进行配置。具体配置格式如下: 3 | 4 | 5 | 6 | 7 | **bootstrap.cnf的instanceId**:指定instance id值, 必须为[0,511]之间的整数,当**cluster.cnf的sequenceInstanceByZk**为true时id由zk生产。 8 | 9 | **cluster.cnf的sequenceStartTime**:指定开始时间戳,格式必须为 YYYY-MM-dd HH:mm:ss,默认开始时间 2010-10-04 09:42:54。。 10 | 11 | 注意事项: 12 | 13 | 1. 当cluster.cnf的sequenceInstanceByZk的值配置为true时,必须配置zookeeper服务器(参见[1.1 cluster.cnf](../1.01_cluster.cnf.md))。 14 | 2. **bootstrap.cnf的instanceId**,保证dble在集群中唯一。 15 | 3. 使用这种方式需要对应字段为bigint来保证63位。 16 | 17 | -------------------------------------------------------------------------------- /1.config_file/1.7_global_sequence/1.7.4_distribute_offset-step.md: -------------------------------------------------------------------------------- 1 | ### 1.7.4 分布式offset-step方式 2 | 3 | 分布式offset-step方式由文件sequence_conf.properties进行配置。具体格式如下: 4 | 5 | \# this is comment 6 | \`**schema1**\`\.\`**table1**\`\.MINID=1001 7 | \`**schema1**\`\.\`**table1**\`\.MAXID=2000 8 | \`**schema1**\`\.\`**table1**\`\.CURID=1000 9 | 10 | \`**schema2**\`\.\`**table2**\`\.MINID=1001 11 | \`**schema2**\`\.\`**table2**\`\.MAXID=20000 12 | \`**schema2**\`\.\`**table2**\`\.CURID=1000 13 | 14 | **schemaX**:使用mysql序列的dble表所属的dble库名。 15 | 16 | **tableX**: 使用mysql序列的dble表名。 17 | 18 | 注意事项: 19 | 20 | 1. 每一个zk序列均需要指定当前区间内最小值MINID, 当前区间内最大值MAXID, 当前区间内当前值CURID。这些值仅在初始配置时有效。 21 | 22 | 2. 初始配置时MINID要比CURID大1, 否则序列值从MINID+1开始。 23 | 24 | 3. 值(MAXID - MINID + 1)为每次从zookeeper服务器获取的序列值数量。 25 | 26 | 4. 配置dble使用zookeeper服务器,具体见相关配置 [1.1 cluster.cnf](../1.01_cluster.cnf.md) 。 27 | 28 | -------------------------------------------------------------------------------- /1.config_file/1.8_cache/1.8.1_cache_setting.md: -------------------------------------------------------------------------------- 1 | ### 1.8.1 cache 配置 2 | #### 1.8.1.1 dble的cache使用 3 | 4 | dble的cache使用有如下两类: 5 | 6 | * SQLRouteCache:从前端连接收到的SQL以及对应的路由结果 内容: schema_user_SQL -> 具体路由结果RouteResult 7 | * ER_SQL2PARENTID:父子表辅助查询SQL以及对应的路由结果。在插入ER子表的时候需要根据子表joinColumn(父表parentColumn)计算它应该插入的结点,所以需要辅助路由来查询,然后将辅助路由及对应的结果缓存下来以备下次查询。内容为:schema:select * from 父表 where parentKey = (value of joinColumn) -> 对应数据shardingNode 8 | 9 | 10 | 11 | #### 1.8.1.2 dble的cache实现 12 | 13 | dble的cache实现有如下几种: 14 | 15 | * ehcache, 用ehcache缓存作为cache实现。 16 | * leveldb, 用leveldb数据库作为cache实现。 17 | * mapdb, 用MapDB数据库引擎作为cache实现。 18 | * rocksdb,用RocksDB数据库引擎作为cache实现。 19 | 20 | #### 1.8.1.3 dble的cache配置 21 | 22 | dble的cache配置分为总配置和实现配置。总配置由文件cacheservice.properties进行设定。实现配置由各个实现具体指定,具体详见各个实现的分章节说明。 23 | 24 | 总配置有如下格式: 25 | 26 | 设置缓存类型: 27 | 28 | factory.**cache_type**=**cache_type** 29 | 30 | 设置分类缓存的具体值,key为缓存池名字,value是类型,最大容量,以及失效时间 31 | 32 | ##### A.SQL路由缓存 33 | pool.SQLRouteCache=**type**,**max_size**,**expire_seconds** 34 | ##### B.ER表子表路由缓存 35 | pool.ER_SQL2PARENTID=**type**,**max_size**,**expire_seconds** 36 | 37 | 38 | 39 | #### 1.8.1.4 cache配置说明 40 | 41 | 总配置文件中各配置项说明: 42 | 43 | a. 以#开头的行为注释,被忽略。 空行被忽略。 44 | 45 | b. factory.**cache_type**=**cache_type**是cache的总开关。**cache_type**指定cache类型,具体可以为:ehcache,leveldb、mapdb 或者rocksdb。如果要用cache功能,必须配置该配置项。这个配置项可以指定多个, 每行仅能指定一个。每一个指定一个cache实现。 46 | 47 | 例如: 48 | 49 | 配置, 50 | 51 | factory.encache=ehcache 52 | pool.SQLRouteCache=encache,10000,1800 53 | pool.ER_SQL2PARENTID=encache,1000,1800 54 | 55 | 中的**type**就必须是ehcache。而配置: 56 | 57 | factory.encache=ehcache 58 | factory.leveldb=leveldb 59 | pool.SQLRouteCache=**encache**,10000,1800 60 | pool.ER_SQL2PARENTID=**leveldb**,1000,1800 61 | 62 | 中的**type**可以为encache或者leveldb。 63 | 64 | c. pool.SQLRouteCache=**type**,**max_size**,**expire_seconds**和pool.ER_SQL2PARENTID=**type**,**max_size**,**expire_seconds**分别配置SQLRouteCache和ER_SQL2PARENTID的缓存功能。这两个配置项可以配置也可以不配置, 不配值则不使用相应的缓存功能。**type**指定缓存类型,必须是已配置的缓存实现类型;**max_size**指定缓存的最大大小,单位是字节;**expire_seconds**指定缓存项的生命周期,单位是秒。 65 | 66 | d. **default缓存用于缓存没有为其指定特定缓存的表的分区键值到数据所在节点的映射。** 67 | 68 | 69 | #### 1.8.1.5 注意事项 70 | 71 | - 使用 RocksDB作为 cache 实现时,需要在dble目录下手工创建 rocksdb 目录,否则dble启动失败。 72 | 73 | -------------------------------------------------------------------------------- /1.config_file/1.8_cache/1.8.2_ehcache_setting.md: -------------------------------------------------------------------------------- 1 | ### 1.8.2 ehcache緩存配置 2 | 要用ehcache实现缓存,必须在cacheservice.properties中配置使用ehcache,具体请参看上一节内容。 3 | 4 | #### 1.8.2.1 ehcache版本 5 | 6 | 目前,dble使用的是2.6.11. 7 | 8 | #### 1.8.2.2 ehcache配置 9 | 10 | ehcache的配置通过文件ehcache.xml进行。 11 | 12 | 具体的缓存存储策略和配置请参看[http://www.ehcache.org/documentation/ehcache-2.6.x-documentation.pdf](http://www.ehcache.org/documentation/ehcache-2.6.x-documentation.pdf)。 13 | 14 | 例如: 15 | 16 | ``` 17 | 18 |                 19 | 20 | ``` 21 | 22 | 需要特殊说明是: 23 | 24 | 1.dble仅用ehcache配置的defaultCache级别创建cache。 25 | 26 | 2.maxEntriesLocalHeap 27 | 28 | 该属性指定允许存储元素的最大条数。如果设定了该值且不为0,则缓存大小限制为缓存的**条数限制**,具体限制由cacheservice.properties中**max_size**指定,参见上一节内容。如果没有设定该参数,则缓存大小限制仍为大小限制,具体限制由cacheservice.properties中**max_size**指定,参见上一节内容。 29 | 3.timeToIdleSeconds 30 | 31 | 该属性指定一个元素在不被请求的情况下允许在缓存中存在的最长时间。它将被cacheservice.properties中**expire_seconds**取代。 32 | 33 | 4.dble将defaultCache配置应用到每一个创建的cache。 34 | 35 | -------------------------------------------------------------------------------- /1.config_file/pic/1.1_stringhash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/1.1_stringhash.png -------------------------------------------------------------------------------- /1.config_file/pic/3.20.07.0_config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/3.20.07.0_config.png -------------------------------------------------------------------------------- /1.config_file/pic/add_library_global.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/add_library_global.png -------------------------------------------------------------------------------- /1.config_file/pic/add_to_library.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/add_to_library.png -------------------------------------------------------------------------------- /1.config_file/pic/alert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/alert.png -------------------------------------------------------------------------------- /1.config_file/pic/build.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/build.png -------------------------------------------------------------------------------- /1.config_file/pic/check_logic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/check_logic.png -------------------------------------------------------------------------------- /1.config_file/pic/create_packet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/create_packet.png -------------------------------------------------------------------------------- /1.config_file/pic/create_project_global.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/create_project_global.png -------------------------------------------------------------------------------- /1.config_file/pic/dble_update_config: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/dble_update_config -------------------------------------------------------------------------------- /1.config_file/pic/dble_update_config_arm64: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/dble_update_config_arm64 -------------------------------------------------------------------------------- /1.config_file/pic/function_code_global.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/function_code_global.png -------------------------------------------------------------------------------- /1.config_file/pic/function_loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/function_loading.png -------------------------------------------------------------------------------- /1.config_file/pic/global_package.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/global_package.png -------------------------------------------------------------------------------- /1.config_file/pic/inheritance_and_imeplementation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/inheritance_and_imeplementation.png -------------------------------------------------------------------------------- /1.config_file/pic/intelliJ/addlib.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/intelliJ/addlib.png -------------------------------------------------------------------------------- /1.config_file/pic/intelliJ/artifacts.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/intelliJ/artifacts.jpg -------------------------------------------------------------------------------- /1.config_file/pic/intelliJ/artifacts2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/intelliJ/artifacts2.jpg -------------------------------------------------------------------------------- /1.config_file/pic/intelliJ/build.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/intelliJ/build.png -------------------------------------------------------------------------------- /1.config_file/pic/intelliJ/create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/intelliJ/create.png -------------------------------------------------------------------------------- /1.config_file/pic/intelliJ/lib.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/intelliJ/lib.png -------------------------------------------------------------------------------- /1.config_file/pic/java_project_create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/java_project_create.png -------------------------------------------------------------------------------- /1.config_file/pic/packet_detail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/packet_detail.png -------------------------------------------------------------------------------- /1.config_file/pic/routing_prototype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/1.config_file/pic/routing_prototype.png -------------------------------------------------------------------------------- /2.Function/2.01_manager_cmd.md: -------------------------------------------------------------------------------- 1 | ## 2.1 管理端命令集 2 | * [2.1.1 select命令](2.1_manager_cmd/2.1.01_select.md) 3 | * [2.1.2 set命令](2.1_manager_cmd/2.1.02_set.md) 4 | * [2.1.3 show命令](2.1_manager_cmd/2.1.03_show.md) 5 | * [2.1.4 switch命令](2.1_manager_cmd/2.1.04_switch.md) 6 | * [2.1.5 kill命令](2.1_manager_cmd/2.1.05_kill.md) 7 | * [2.1.6 stop命令](2.1_manager_cmd/2.1.06_stop.md) 8 | * [2.1.7 reload命令](2.1_manager_cmd/2.1.07_reload.md) 9 | * 2.1.8 rollback命令(已废弃) 10 | * [2.1.9 offline命令](2.1_manager_cmd/2.1.09_offline.md) 11 | * [2.1.10 online命令](2.1_manager_cmd/2.1.10_online.md) 12 | * 2.1.11 file命令(已废弃) 13 | * 2.1.12 log命令(已废弃) 14 | * [2.1.13 配置检查命令](2.1_manager_cmd/2.1.13_dryrun.md) 15 | * [2.1.14 pause & resume 命令](2.1_manager_cmd/2.1.14_pause_resume.md) 16 | * [2.1.15 慢查询日志相关命令](2.1_manager_cmd/2.1.15_slow_query.md) 17 | * [2.1.16 创建/删除物理库命令](2.1_manager_cmd/2.1.16_database.md) 18 | * [2.1.17 check @@metadata命令](2.1_manager_cmd/2.1.17_check_meta_data.md) 19 | * [2.1.18 release @@reload_metadata 命令](2.1_manager_cmd/2.1.18_release.md) 20 | * [2.1.19 split 命令](2.1_manager_cmd/2.1.19_split.md) 21 | * [2.1.20 flow_control 命令](2.1_manager_cmd/2.1.20_flow_control.md) 22 | * [2.1.21 刷新连接池命令](2.1_manager_cmd/2.1.21_fresh_conn.md) 23 | * [2.1.22 脱离集群命令](2.1_manager_cmd/2.1.22_detach_cluster.md) 24 | -------------------------------------------------------------------------------- /2.Function/2.02_global_sequence.md: -------------------------------------------------------------------------------- 1 | ## 2.2 全局序列 2 | 3 | 在分库分表的情况下,数据库自增主键无法保证自增主键的全局唯一。 4 | 为此,dble提供了全局序列,并且针对不同应用场景提供了多种实现方式。 5 | 要应用全局序列,需要在cluster.cnf中配置: 6 | ``` 7 | sequenceHandlerType=n 8 | ``` 9 | 其中sequenceHandlerType包括如下种类: 10 | + 1:[MySQL offset-step方式](2.2_global_sequence/2.2.1_MySQL-offset-setp.md) 11 | + 2:[时间戳方式](2.2_global_sequence/2.2.2_timestamp.md) 12 | + 3:[分布式时间戳方式](2.2_global_sequence/2.2.3_distribute_timestamp.md) 13 | + 4:[分布式offset-step方式](2.2_global_sequence/2.2.4_distribute_offset-step.md) 14 | 15 | 全局序列用于给自增列赋值,写入数据时字段值由系统自动生成,不可以再指定值,使用示例: 16 | ``` 17 | /*id为主键,配置为自增长*/ 18 | insert into table1(name) values('test'); 19 | ``` 20 | 21 | -------------------------------------------------------------------------------- /2.Function/2.04_hint.md: -------------------------------------------------------------------------------- 1 | ## 2.4 注解/Hint 2 | Hint, 即注解。 我们定义为:在要执行的SQL语句前添加额外的一段由注解组织的代码,这样SQL就能按照编写者的意图执行,这段代码称之为“注解”。 3 | 注解的作用如下: 4 | 5 | + 指定路由,比如强制读写分离。 6 | + 帮助dble支持一些不能实现的语句,如单节点内存储过程的创建和调用,如insert…select…; 7 | 8 | 9 | 原理解释:分布式环境下执行SQL语句的流程是先进行SQL解析处理,计算出路由信息后,然后到对应的物理库上去执行;若传入的SQL语句无法解析,则不会去执行。注解则可以告诉解析器按照注解内的SQL(称之为注解SQL)去进行解析处理,解析出路由信息后,将真正要执行的SQL语句(称之为原始SQL)发送到对应的物理库上去执行。 10 | 11 | 12 | ### 2.4.1 Hint语法 13 | 14 | Hint语法有三种形式: 15 | 16 | 1. /\*!dble:type=....*/ 17 | 2. /\*#dble:type=...*/ 18 | 3. /\* */(只适用于读写分离功能) 19 | 20 | ``` 21 | "/*#dble: */" for mybatis and "/*!dble: */" for mysql 22 | ``` 23 | 24 | 具体语法介绍请见:[Hint](../3.SQL_Syntax/3.8_Hint.md) 25 | 26 | 27 | 其中,type有4种值可选:shardingnode,db_type,sql,db_instance_url。每一种值的功能和形式详见各个部分的具体说明。 28 | 29 | ### 2.4.2 类型shardingnode 30 | 31 | 1. 形式 32 | shardingnode=node 33 | 其中,node为单个数据节点名,不能为多值(node定义参见配置1.5 sharding.xml)。 34 | 2. 功能 35 | 为不方便路由或者不能路由的的语句指定具体的目的数据节点。 36 | 37 | ### 2.4.3 类型db_type 38 | 39 | 1. 形式 40 | db_type=master或者db_type=slave 41 | 2. 功能 42 | 帮助实现正确的业务逻辑,强制读写分离。 43 | 3. 注意事项 44 | delete, insert, replace, update, ddl语句不能使用db_type=slave进行注解。 45 | 46 | 47 | ### 2.4.4 类型sql 48 | 49 | 1. 形式 50 | sql=**sql_statement** 51 | 2. 功能 52 | 用**sql_statement**的路由结果集作为实际sql语句的执行数据节点。支持存储过程。 53 | 54 | 55 | ### 2.4.5 类型db_instance_url 56 | 57 | 1. 形式 58 | 类型db_instance_url=**ip:port** 59 | 2. 功能 60 | 在读写分离场景下,可直接下发到相应的mysql实例 61 | 3. 注意事项 62 | 运行delete, insert, replace, update, ddl语句时需考虑mysql节点的read_only属性 63 | 64 | 65 | ### 2.4.6 注意事项 66 | 写注解需要注意如下事项: 67 | + dble的注解和MySQL原生注解含义不同, 想通过MySQL原生注解来设置变量或者指定索引是无法得到预期结果的。如[#1169](https://github.com/actiontech/dble/issues/1169) 68 | + 使用select语句作为注解SQL,不要使用delete/update/insert 等语句。 delete/update/insert 等语句虽然也能用在注解中,但这些语句在SQL处理中有一些额外的逻辑判断,会降低性能,不建议使用; 69 | + 注解SQL 本身禁用表关联语句,注解目的是路由计算,如果本身写得过于复杂,会影响路由计算; 70 | + 使用hint做DDL需要额外执行reload @@metadata 71 | + 使用hint做session级别的系统变量和环境变量可能不会生效,请慎用 72 | + 使用注解并不额外增加的执行时间;从解析复杂度以及性能考虑,注解SQL应尽量用最简单的SQL 语句,如select id from tab_a where id=’10000’; 73 | + 能不用注解也能够解决的场景,尽量不用注解。 74 | + 在读写分离场景下,语句为/* xxx */的注释(纯注释,不包含sql),uproxy会将该语句发往slave,dble会将该语句发往master。 75 | 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /2.Function/2.05_distribute_transaction.md: -------------------------------------------------------------------------------- 1 | ## 2.5 分布式事务 2 | * [2.5.1 XA事务概述](2.5_distribute_transaction/2.5.1_XA_trans_overview.md) 3 | * [2.5.2 XA事务的提交以及回滚](2.5_distribute_transaction/2.5.2_XA_trans_commit&rollback.md) 4 | * [2.5.3 XA事务的后续补偿以及日志清理](2.5_distribute_transaction/2.5.3_XA_trans_make_up.md) 5 | * [2.5.4 XA事务的记录](2.5_distribute_transaction/2.5.4_XA_trans_records.md) 6 | * [2.5.5 一般分布式事务概述](2.5_distribute_transaction/2.5.5_normal_trans_overview.md) 7 | * [2.5.6 检测疑似残留XA事务](2.5_distribute_transaction/2.5.6_XA_trans_residual_xid.md) 8 | 9 | 10 | -------------------------------------------------------------------------------- /2.Function/2.07_memory_manager.md: -------------------------------------------------------------------------------- 1 | ## 2.7 内存管理 2 | 3 | ### 2.7.1 内存结构概览: 4 | ![内存结构概览](pic/2.7_memory_structure.png) 5 | 6 | * On-Heap 大小由JVM 参数Xms ,Xmx 决定,就是正常服务需要的内存,由jvm自动分配和回收。 7 | 8 | * Off-Heap大小由JVM 参数 XX:MaxDirectMemorySize 大小确定。 9 | 10 | * DirectByteBufferPool 大小 = bufferPoolPageNumber*bufferPoolPageSize 11 | 12 | bufferPoolPageNumber和bufferPoolPageSize可在bootstrap.cnf 配置 ,bufferPoolPageSize默认为2M, bufferPoolPageNumber默认为(MaxDirectMemorySize * 0.8 /bufferPoolPageSize), 向下取整。 13 | 14 | * 映射文件区不在JVM之内 15 | 16 | 大小计算方法求得值tmpMin= Min(物理内存的一半, free内存) 17 | 18 | 可在映射区保存的文件的个数=(向下取整(tmpMin/mappedFileSize)) 19 | 20 | 真实使用值= 可在映射区保存的文件的个数*mappedFileSize (mappedFileSize默认64M) 21 | 22 | 其中mappedFileSize可由bootstrap.cnf 指定 23 | 24 | 注:这里是通过单例模式,一次性确定映射文件区的大小,如果运行过程中,内存被其他进程占用,这里可能存在风险 25 | 26 | 27 | 28 | ### 2.7.2 DirectByteBufferPool 29 | BufferPool结构概览: 30 | 31 | ![BufferPool结构概览](pic/2.7_bufferpool_structure.png) 32 | 33 | 单个bufferPoolPage的内部结构: 34 | 35 | ![BufferPool结构概览](pic/2.7_bufferpage_structure.png) 36 | 37 | 38 | #### 1.用途: 39 | ##### 1.1 网络读写时使用 40 | ##### 1.2 中间结果集暂存时用于写数据前的缓存buffer 41 | #### 2.初始化: 42 | 按照参数,初始化为bufferPoolPageNumber个页,每个页大小为bufferPoolPageSize 43 | 44 | #### 3.内存分配 45 | ##### 3.1 分配大小 46 | 如果不指定分配大小,则默认分配一个最小单元(最小单元由bufferPoolChunkSize决定,默认大小为 4k,请最好设为bufferPoolPageSize 的约数,否则最后一个会造成浪费)。 47 | 48 | 如果指定分配大小,则分配放得下分配大小的最小单元的整数倍(向上取整) 。 49 | 50 | 总之,大小为 M*bufferPoolChunkSize 51 | 52 | ##### 3.2 分配方式 53 | 遍历 缓冲池从N+1页到bufferPoolPageNumber-1页(上次分配过的记为第N页) 54 | 55 | 对单页加锁在每个页中从头寻找未被使用的连续M个最小单元 56 | 57 | 如果没找到,再从第0页找到第N页 58 | 59 | 以上成功后更新上次分配页,标记分配的单元 60 | 61 | 如果找不到可存放的单页(比如大于bufferPoolPageSize ),直接分配On-Heap内存 62 | 63 | 64 | 65 | 66 | 67 | 68 | #### 4.内存回收 69 | ##### 4.1 如果是On-Heap内存 70 | 直接clear,等GC回收 71 | 72 | ##### 4.2 如果是Off-Heap内存 73 | 遍历所有页,找到对应页 74 | 75 | 对单页加锁,到对应页的对应块的位置,标记为未使用 76 | 77 | ### 2.7.3 处理中间结果集过大时内存使用 78 | 79 | 目前dble 对每个session的内存管理如下: 80 | 81 | * Join内存管理,对应上限参数joinMemSize(默认4M),用于管理join操作暂存的数据 82 | * Order内存管理,对应上限参数orderMemSize(默认4M),用于管理排序操作暂存的数据 83 | * Other内存管理,对应上限参数otherMemSize(默认4M),用于管理distinct、group、nestloop等操作总暂存的数据 84 | 85 | 86 | 每一个复杂查询中,当子查询单元需要在中间件当中暂存数据的时候,数据会存在Heap内存当中,但如果当前存储使用的内存大于4M,则需要写内存映射文件。 87 | 如果内存映射文件个数达到上限(参见概览中的可在映射区保存的文件的个数),则会去写硬盘。 88 | 写文件的时候,当单个文件大于mappedFileSize时,会将文件拆分。 89 | 90 | 注1:内存映射文件总大小在第一次使用时就确定,有风险 91 | 注2:写硬盘时候的缓冲区是从DirectByteBufferPool申请的chunk大小的 92 | 93 | -------------------------------------------------------------------------------- /2.Function/2.09_Grpc_warning.md: -------------------------------------------------------------------------------- 1 | ## 2.9 Grpc告警功能 2 | 3 | ### 2.9.1 告警功能概述 4 | Dble拥有和商业项目ucore进行告警对接的功能,当dble触发某些重要的报错信息时,会通过ucore提供的grpc接口将对应的告警信息发送到ucore告警中,免去了运维人员在日志文件中的大量搜索,能够直观展示在页面上。 5 | 6 | ### 2.9.2 告警配置依赖 7 | 8 | #### 依赖cluster.cnf和bootstrap.cnf 的告警的基础信息 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |
名称内容默认值详细作用原理或应用实例/全局属性
url grpc告警的urlcluster.cnf 里的clusterIP在发送grpc的时候作为IP地址使用实例
28 | port 29 | 告警端口cluster.cnf 里的clusterPort grpc发送的目的端口实例
37 | serverId 38 | 服务器ID$ushard-id(ip1,ip2) ,其中$ushard-id 是bootstrap.cnf 里的instanceName 接口参数实例
46 | componentId 47 | 组件ID$ushard-id 即bootstrap.cnf 里instanceName 接口参数实例
55 | componentType 56 | 组件类型ushard接口参数实例
64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /2.Function/2.10_table_meta.md: -------------------------------------------------------------------------------- 1 | ## 2.10 meta数据管理 2 | Meta数据的管理包含以下部分: 3 | 4 | * [2.10.1 Meta信息初始化](2.10_table_meta/2.10.1_Meta_init.md) 5 | * [2.10.2 Meta信息维护](2.10_table_meta/2.10.2_Meta_change.md) 6 | * [2.10.3 一致性检测](2.10_table_meta/2.10.3_consistency_check.md) 7 | * [2.10.4 View Meta](2.10_table_meta/2.10.4_View_Meta.md) 8 | 9 | -------------------------------------------------------------------------------- /2.Function/2.10_table_meta/2.10.1_Meta_init.md: -------------------------------------------------------------------------------- 1 | ### 2.10.1 Meta信息初始化 2 | dble在启动时会逐个同步抓取相关表,视图的信息,并对分区表做一致性检测。 3 | 4 | #### 2.10.1.1 表信息的初始化 5 | 表信息是从后端数据节点抓取的。dble在启动时会根据schema,table,数据节点的配置(参见1.5 sharding.xml)对逐个数据节点执行: 6 | 7 | show tables; 8 | 9 | show create table ... 10 | 11 | 获取后端表的实际创建信息并做解析以获取需要的信息。 12 | 13 | #### 2.10.1.2 视图信息的初始化 14 | 视图的信息是属于Dble中间件的状态信息,是为数不多的Dble自有的状态之一,存在两种形式的初始化 15 | 16 | 1 非集群模式状态下通过本地文件进行view的存储和初始化 17 | 18 | 2 集群状态下通过ZK进行view的存储和初始化 19 | 20 | 关于其他view meta的实现以及使用细节详见2.10.4 view meta 21 | 22 | #### 2.10.1.3 分区表的一致性规则 23 | 分区表分布在多个实例上的后端表的表结构不必完全相同,但最好完全形同。多个后端表被认为一致的规则为: 24 | 25 | + 有相同的列; 26 | + 有相同的主键; 27 | + 有相同的唯一键; 28 | + 有同样的索引; 29 | + 有相同的键。 30 | 31 | 只要这五个方面相同就认为后端的表具有一致性,一致性检测通过。 32 | 33 | -------------------------------------------------------------------------------- /2.Function/2.10_table_meta/2.10.2_Meta_change.md: -------------------------------------------------------------------------------- 1 | ### 2.10.2 Meta信息维护 2 | dble在每次执行某些类型ddl语句之后都会更新相关表,视图的元信息。目前,更新元信息的ddl语句类型如下: 3 | 4 | + create table语句 5 | + drop table语句 6 | + alter table语句 7 | + truncate table语句 8 | + create index语句 9 | + drop index语句 10 | 11 | 根据是否配置zookeeper服务器服务(参见1.1 cluster.cnf),Meta信息的维护逻辑分如下两种情况: 12 | 13 | 1. 不用zookeeper服务 14 | 在此种情况下,由于仅有一个dble运行实例,本地更新已是全部信息,不必做进一步的维护逻辑。 15 | 2. 利用zookeeper服务 16 | 此种情况下的更新逻辑为: 17 | a. 在启动时每一个dble实例都向zookeeper服务器注册监听事件,监听系统中表元信息的改变。 18 | b. 当某一个dble实例更新了某些表的元信息之后,它负责向zookeepr服务器广播更新事件。 19 | c. 其他dble实例在监听到更新事件后更新自己维护的元信息。 20 | 21 | -------------------------------------------------------------------------------- /2.Function/2.10_table_meta/2.10.3_consistency_check.md: -------------------------------------------------------------------------------- 1 | ### 2.10.3 一致性检测 2 | 由于Dble对于分片的应用和处理可以看到,对于某张具体的分片表,dble默认在具体数据库节点上的所有表格的实体拥有同样的结构,由于可能在Dble运行的过程中的种种问题导致了数据库节点的表格结构不一致的情况,在Dble中有对于各个分片表的表格结构进行定期检查确认的机制。 3 | 4 | 分片表结构一致性检查的定时任务为tableStructureCheckTask,其周期为checkTableConsistencyPeriod默认值30×60×1000(30分钟),任务开关为checkTableConsistency默认为0(关闭),以上配置均配置在bootstrap.cnf中 5 | 6 | 大致的表格一致性检查任务逻辑如下: 7 | 8 | + 循环配置信息中的schema以及table 9 | + 检查对应数据库和表格的meta信息是否存在 10 | + 对于每个有效的节点下发SQL “show create table” 11 | + 根据收到的建表语句创建新的meta,并通过Set进行去重 12 | + 判断有几个不同的meta,若meta数量超过一个则进行在日志中打印告警信息 13 | + 将新老的meta进行对比,如果发现新老meta之间的meta也不一致则在日志中打印告警信息 14 | 15 | 整体的流程图如下: 16 | ![一致性检测](pic/2.10.3_consistency_check.png) 17 | 18 | ##### 全局表的一致性检查 19 | 全局表在Dble的使用中被认为每个节点都存在全量的数据,所以在全局表的检查中不光检查了全局表的表格结构,还在需要另外检查表格的数据一致性,功能开启由全局表具体配置来决定。 20 | 21 | -------------------------------------------------------------------------------- /2.Function/2.10_table_meta/2.10.4_View_Meta.md: -------------------------------------------------------------------------------- 1 | ### 2.10.4 view meta 2 | 3 | #### 2.10.4.1 view 种类 4 | + mysql中的view 5 | + dble中的view 6 | 7 | #### 2.10.4.2 view meta概述 8 | 在Dble 2.18.11.0 版本中新增了对view的支持,作为一个中间件支持view采用的方法是和复杂查询类似的逻辑,将VIEW创建的语句中的select部分进行解析,并将解析所得到的解析树进行存储,当有query调用到视图的时候使用解析树进行局部的替代还原成完整的查询SQL,从而达到view实现的效果。 9 | 10 | 在MySQL中的View meta信息是一种持久化的存储。Dble中的view实现方式也类似,这样Dble中view的实现会给Dble本身带来状态,这个状态需要Dble自身进行保存和维护,所以在view中采取了和XA事务日志相似的方式,并且以视图创建SQL的形式进行以下两种方式的存储: 11 | 12 | + 本地文件存储 13 | + ZK存储 14 | 15 | 在每次发生重启的时候Dble会在初始化meta的时候,通过读取文件或者是ZK中的信息将创建视图的SQL进行重新的解析,最终以解析树的形式保存到meta中去。 16 | 17 | 在Dble 2.19.10.0版本中新增了对mysql view创建的支持,mysql view会被dble直接下发到后端mysql中执行。 18 | 不过,创建mysql view有着各种限制,首先view 所属的schema必须采取以下配置,即垂直分片的方式: 19 | ```xml 20 | 21 | 22 | ``` 23 | view中涉及的表必须是shardingNode dn5 中的表。对于mysql view,dble则没有持久化,但是依然会有相对应的view meta。mysql view 支持通过dble修改,也支持在后端节点手动修改并通过reload方式加载到dble。 24 | 25 | #### 2.10.4.2 view meta保存 26 | ##### 本地文件存储 27 | 本地文件的存储中,对应的信息以JSON的格式存放在本地文件中,文件的存储路径以及文件名称通过bootstrap.cnf中的viewPersistenceConfBaseDir和viewPersistenceConfBaseName两个参数进行配置(默认存储于./viewConf/viewJson中),具体的文件内容举例如下 28 | ``` 29 | [{ 30 | "schema": "testdb", 31 | "list": [{ 32 | "name": "view_test", 33 | "sql": "create view view_test as select * from a_test" 34 | }, { 35 | "name": "vt2", 36 | "sql": "create or replace view vt2 as select * from suntest" 37 | }, { 38 | "name": "suntest", 39 | "sql": "create view suntest as select * from sbtest" 40 | }] 41 | }] 42 | ``` 43 | ##### ZK K/V存储 44 | 在集群状态下Dble的各个内部状态需要同步,包括view的创建删除和修改,具体的key值会存储在ZK BASE_PATH/view下,并使用key值schema_name:view_name,在view中使用json的格式进行create sql和修改的serverID的存储,以下给出一个举例: 45 | ``` 46 | { 47 | "serverId":"10010", 48 | "createSql":"create view view_test as select * from a_test" 49 | } 50 | ``` 51 | 此JSON字符串当作value存储在 /..../view/testdb:view_test -------------------------------------------------------------------------------- /2.Function/2.10_table_meta/pic/2.10.3_consistency_check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/2.10_table_meta/pic/2.10.3_consistency_check.png -------------------------------------------------------------------------------- /2.Function/2.11_statistics_manager.md: -------------------------------------------------------------------------------- 1 | ## 2.11 统计管理 2 | 统计管理包含以下几个部分 3 | 4 | * [2.11.1 查询条件统计](2.11_statistics_manager/2.11.1_condition_stat.md) 5 | * [2.11.2 表状态统计](2.11_statistics_manager/2.11.2_table_stat.md) 6 | * [2.11.3 用户状态统计](2.11_statistics_manager/2.11.3_user_stat.md) 7 | * [2.11.4 命令统计](2.11_statistics_manager/2.11.4_cmd_stat.md) 8 | * [2.11.5 heartbeat统计](2.11_statistics_manager/2.11.5_heartbeat_stat.md) 9 | * [2.11.6 网络读写统计](2.11_statistics_manager/2.11.6_net_io_stat.md) 10 | * [2.11.7 快速sql统计命令](2.11_statistics_manager/2.11.7_sql_stat.md) 11 | 12 | -------------------------------------------------------------------------------- /2.Function/2.11_statistics_manager/2.11.1_condition_stat.md: -------------------------------------------------------------------------------- 1 | ### 2.11.1 查询条件统计 2 | 查询条件统计是在处理查询结果时进行的。统计的是关于某个表中关于某列的条件。 3 | dble系统每次只能进行关于一个表中的一个列的条件统计。 4 | 要进行此类统计首先必须开启enableStatisticAnalysis,其次要设置要统计的表和列,详见下节。 5 | 6 | #### 2.11.1.1 查询条件统计表列设置 7 | 查询条件统计表列的设置命令: 8 | reload @@query_cf=**table**&**column**; 9 | 10 | 其中**table**为要统计的目标表的表名,**column**为目标表中目标列的列名。 11 | 如果要清除查询条件统计表列的设置执行命令: 12 | ``` 13 | reload @@query_cf; 14 | ``` 15 | #### 2.11.1.2 查看查询条件统计结果 16 | 要查看查询条件统计结果执行如下命令: 17 | ``` 18 | show @@sql.condition; 19 | ``` 20 | 21 | 22 | -------------------------------------------------------------------------------- /2.Function/2.11_statistics_manager/2.11.2_table_stat.md: -------------------------------------------------------------------------------- 1 | ### 2.11.2 表状态统计 2 | 表状态统计是在处理查询结果时进行的。要进行此类统计必须开启enableStatisticAnalysis。 3 | 4 | #### 2.11.2.1 统计内容 5 | 表状态主要统计如下内容: 6 | 7 | + 读操作的次数 8 | + 写操作的次数 9 | + 表关系,即在同一个语句中出现多个表,以第一个表作为操作的主表,其他表是和主表有关系的表。 10 | + 对主表最后一次操作的时刻。 11 | 12 | #### 2.11.2.2 统计结果查看 13 | 表状态的统计结果可以通过如下命令查看: 14 | ``` 15 | show @@sql.sum.table; 16 | ``` 17 | 18 | 如果要重置表状态统计,执行如下命令: 19 | ``` 20 | show @@sql.sum.table true; 21 | ``` 22 | -------------------------------------------------------------------------------- /2.Function/2.11_statistics_manager/2.11.3_user_stat.md: -------------------------------------------------------------------------------- 1 | ### 2.11.3 用户状态统计 2 | 3 | 用户状态统计是在处理查询结果时进行的。要进行此类统计必须开启enableStatisticAnalysis。 4 | 5 | #### 2.11.3.1 统计内容 6 | 7 | 用户状态主要统计如下内容: 8 | 9 | + 读操作的次数 10 | + 写操作的次数 11 | + 执行的时间分布情况 12 | 13 | #### 2.11.3.2 用户状态统计服务的命令 14 | 15 | ``` 16 | + show @@sql.sum; 17 | + show @@sql.sum.user; 18 | ``` 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /2.Function/2.11_statistics_manager/2.11.4_cmd_stat.md: -------------------------------------------------------------------------------- 1 | ### 2.11.4 命令统计 2 | 命令统计是分类统计dble执行的命令计数,在执行各个命令类的命令时进行统计。统计的命令类如下: 3 | 4 | 1. initDB 5 | 2. query 6 | 3. stmtPrepare 7 | 4. stmtSendLongData 8 | 5. stmtReset 9 | 6. stmtExecute 10 | 7. stmtClose 11 | 8. ping 12 | 9. kill 13 | 10. quit 14 | 11. heartbeat 15 | 12. other,除以上命令类命令之外的所有命令。 16 | 17 | #### 2.11.4.1 命令统计结果查看 18 | 命令统计结果查看执行如下命令: 19 | 20 | + show @@command; 21 | + show @@command.count; 22 | 具体命令的使用请参看[2.1 管理端命令集](../2.1_manager_cmd.md) 23 | 24 | -------------------------------------------------------------------------------- /2.Function/2.11_statistics_manager/2.11.5_heartbeat_stat.md: -------------------------------------------------------------------------------- 1 | ### 2.11.5 heartbeat统计 2 | heartbeat统计后端mysql实例的heartbeat状态信息,在对后端mysql实例进行heartbeat检测时进行统计。 3 | 4 | #### 2.11.5.1 统计内容 5 | heartbeat统计每一次从heartbeat查询发送到查询结果接收之间的时间差,同步状态。 6 | 7 | #### 2.11.5.2 统计结果查看 8 | heartbeat统计的查看执行如下命令: 9 | 10 | + show @@heartbeat; 11 | + show @@heartbeat.detail where name=xxx; 其中,xxx为dbinstance名字。 12 | + show @@dbinstance.synstatus; 13 | + show @@dbinstance.syndetail where name=xxx;其中,xxx为dbinstance名字。 14 | 15 | 以上命令的使用请参看参看[2.1 管理端命令集](../2.01_manager_cmd.md) 16 | 17 | -------------------------------------------------------------------------------- /2.Function/2.11_statistics_manager/2.11.6_net_io_stat.md: -------------------------------------------------------------------------------- 1 | ### 2.11.6 网络读写统计 2 | dble的每一个前后端在进行网络通信时对读写的数据量进行统计。 3 | 4 | #### 2.11.6.1 统计内容 5 | + 网络读字节数 6 | + 网络写字节数 7 | + 最后一次进行读/写的时刻 8 | 9 | #### 2.11.6.2 服务的命令 10 | + show @@connection; 11 | + show @@backend; 12 | + show @@connection.sql; 13 | 14 | 以上命令的使用请参看[2.1 管理端命令集](../2.1_manager_cmd.md) 15 | 16 | -------------------------------------------------------------------------------- /2.Function/2.11_statistics_manager/2.11.7_sql_stat.md: -------------------------------------------------------------------------------- 1 | ### 2.11.7 快速sql统计命令 2 | sql统计在执行过程中进行的, 要进行此类统计必须开启samplingRate=100。 3 | 以下命令的数据来源于管理端sql_log表。相关配置见[sql统计](../2.28_sql_statistic.md) 4 | 5 | #### 2.11.3.1 统计内容 6 | 主要统计如下内容: 7 | 1. 执行sql的用户、开始时间、耗时 8 | 2. 近期执行频率较高的sql 9 | 3. 符合慢sql的查询 10 | 4. sql响应的结果集行数超过10000条的 11 | 5、结果集响应包的大小超过maxResultSet的 12 | 13 | #### 2.11.3.2 sql快速统计服务的命令 14 | ``` 15 | + show @@sql; 16 | + show @@sql.high; 17 | + show @@sql.slow; 18 | + show @@sql.large; 19 | + show @@sql.resultset; 20 | ``` 21 | #### 2.11.3.3 统一清理方式 22 | ``` 23 | truncate sql_log 24 | ``` 25 | 26 | -------------------------------------------------------------------------------- /2.Function/2.12_failover.md: -------------------------------------------------------------------------------- 1 | ## 2.12 故障切换 2 | 版本2.20.04.0起对切换功能进行了重定义,废除原有的切换功能,请知悉。 3 | 新的MySQL高可用切换分为两类: 4 | 一个是单实例部署的dble会内置一个自带的高可用切换的python3脚本,跟随dble启动和停止,需要设置bootstrap.cnf中system的useOuterHa 参数为false。 5 | 另一个是支持第三方的高可用切换接口功能,支持集群部署。当然,单实例dble也可以采用这种方式,需要设置system的useOuterHa 参数为true. 6 | 这种方式情况下,如果没有真的配置第三方高可用切换组件,则什么也不会发生。 7 | 具体请参考[高可用切换接口](2.23_outerHa_linkage.md) 8 | 9 | ### 2.12.1 前提条件 10 | * 单实例部署的dble,设置bootstrap.cnf中system的useOuterHa 参数为false。 11 | * 安装好相应的python3环境,详情参考本章"自定义python脚本"部分 12 | 13 | ### 2.12.2 工作方式 14 | dble启动时跟随dble启动python3脚本进程,脚本会读取db.xml内部的配置,检查后端数据库结点的状态,发生异常后会执行切换命令来通知dble 15 | 16 | dble提供以下运维命令: 17 | ``` 18 | show @@custom_mysql_ha 19 | ``` 20 | 用于查看或者监控当前进程是否存活 21 | 22 | 当python脚本意外终止时, 23 | 可以手工运行命令来启动: 24 | ``` 25 | enable @@custom_mysql_ha 26 | ``` 27 | 28 | 当然,也可以手动关闭该脚本 29 | ``` 30 | disable @@custom_mysql_ha 31 | ``` 32 | 33 | ### 2.12.2 注意事项 34 | #### 2.12.2.1 此功能目前只支持在linux环境下使用。 35 | #### 2.12.2.2 reload注意事项 36 | 做reload @@config 之前需要修改配置文件,这时候如果不停止python脚本,可能会读到中间状态的文件,所以我们建议的标准流程如下: 37 | 1.```disable @@custom_mysql_ha``` 关闭切换功能 38 | 2.修改配置文件 39 | 3.```reload @@config``` 重新加载配置 40 | 4.```enable @@custom_mysql_ha``` 开启切换功能 41 | 42 | #### 2.12.2.3 自定义python脚本 43 | 44 | custom\_mysql\_ha.py 脚本在dble安装目录的bin目录下,使用python3编写,您可以根据实际情况自行修改。 45 | 为了使它能正常工作,需要做以下的准备工作: 46 | ##### 1、安装Python3,确认python3是否已安装可通过如下命令 47 | ``` 48 | /usr/local/bin/python3 --version 49 | /usr/local/bin/pip3 --version 50 | ``` 51 | ##### 2、安装mysqlclient及依赖 52 | CentOS 依赖 53 | ``` 54 | yum install mysql-devel 55 | ``` 56 | or Ubuntu 依赖 57 | ``` 58 | apt-get install libmysqlclient-dev 59 | ``` 60 | 61 | 然后 62 | ``` 63 | pip3 install mysqlclient 64 | ``` 65 | 66 | ##### 3、six 67 | ``` 68 | pip3 install six 69 | ``` 70 | or 71 | ``` 72 | pip3 install six -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 73 | ``` 74 | 75 | ##### 4、coloredlogs 76 | ``` 77 | pip3 install coloredlogs 78 | ``` 79 | or 80 | ``` 81 | pip3 install coloredlogs -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 82 | ``` 83 | 84 | ##### 5、rsa 85 | ``` 86 | pip3 install rsa 87 | ``` 88 | or 89 | ``` 90 | pip3 install rsa -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 91 | ``` 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | -------------------------------------------------------------------------------- /2.Function/2.13_conns_check.md: -------------------------------------------------------------------------------- 1 | ## 2.13 前后端连接检查 2 | 3 | ### 2.13.1 前端连接无响应超时检查 4 | + 根据在bootstrap.cnf中配置的processorCheckPeriod进行定时的前后端连接检查 5 | + 根据配置在bootstrap.cnf中的idleTimeout判断前端连接是否存在无响应时间超限的现象 6 | + 如果发现无响应时间超过限度则关闭连接 7 | 8 | ### 2.13.2 后端连接SQL超时检查 9 | + 根据在bootstrap.cnf中配置的processorCheckPeriod进行定时的前后端连接检查 10 | + 根据配置sqlExecuteTimeout检查所有正在执行的后端连接,是否有执行时间超限的情况 11 | + 关闭所有执行时间超过限度的非DDL后端连接 12 | 13 | -------------------------------------------------------------------------------- /2.Function/2.15_global_table.md: -------------------------------------------------------------------------------- 1 | ## 2.15 global 表 2 | 在一些业务系统中,存在着类似字典表的表格,它们与业务表之间可能有关系,这种关系,可以理解为“标签”,而不应理解为通常的“主从关系”。 3 | 这些表具有以下几个特性: 4 | 5 | + 变动不频繁 6 | + 数据量总体变化不大 7 | + 数据规模不大,很少有超过数十万条记录。 8 | 9 | 鉴于此,dble 定义了一种特殊的表,称之为“全局表”,全局表具有以下特性: 10 | 11 | + 全局表的插入、更新操作会实时在所有节点上执行,保持各个分片的数据一致性 12 | + 全局表的查询操作,只从一个节点获取 13 | + 全局表可以跟任何一个表进行JOIN 操作 14 | 15 | 将字典表或者符合字典表特性的一些表定义为全局表,某种程度上部分解决了数据JOIN的难题。 16 | 举例如下: 17 | ![global_table](pic/2.15_global_table.png) 18 | 19 | 对于数据量不大的字典表(例:超市商品),在多个分片上都有一份同样的副本 20 | 21 | 相关JOIN语句可以直接下发给各个结点,直接合并结果集就行. 22 | 23 | JOIN 例子(伪SQL): 24 | ``` 25 | SELECT 日期,商品名,COUNT(*) AS 订单量 26 | FROM 商品表 27 | JOIN 销售详单 USING(商品ID) 28 | WHERE 日期范围(跨结点) 29 | GROUP BY 日期,商品名。 30 | ``` 31 | 32 | -------------------------------------------------------------------------------- /2.Function/2.16_cache.md: -------------------------------------------------------------------------------- 1 | ## 2.16 cache 的使用 2 | cache 的配置请参见1.6节的内容。 3 | 4 | 5 | ### 2.16.1 路由缓存 6 | 路由缓存里键值对是[sql, 路由节点] 7 | 8 | 配置的值里KEY是pool.SQLRouteCache 9 | VALUE 是逗号隔开的三个值,分别为cachefactory的name,容量,超时时间。 10 | 11 | ### 2.16.2 ER子表计算缓存 12 | 路由缓存里键值对是[子表对应的joinColumn, 路由节点] 13 | 14 | KEY是pool.ER_SQL2PARENTID 15 | 16 | VALUE是逗号隔开的三个值,分别为cachefactory的name,容量,超时时间 17 | 18 | -------------------------------------------------------------------------------- /2.Function/2.18_performance_observation.md: -------------------------------------------------------------------------------- 1 | ## 2.18 性能观测以及调试概览 2 | + Btrace脚本性能观察(观察查询过程中每个不同阶段的耗时) 3 | + manager命令show @@thread_used观察(观察不同线程的负载情况) 4 | 5 | ### 2.18.1 Btrace脚本观察 6 | #### 2.18.1.1 观察 7 | Dble源码中自带观测脚本,[BTraceCostTime.java](https://github.com/actiontech/dble/tree/master/src/main/java/com/actiontech/dble/btrace/script/BTraceCostTime.java)文件是专用的Btrace观测脚本,当前脚本适用Btrace v.1.3 8 | Btrace 相关资料[https://github.com/btraceio/btrace](https://github.com/btraceio/btrace) 9 | 开启性能观察的统计需要配置bootstrap.cnf中的两个参数useCostTimeStat和costSamplePercent,分别是启用耗时监控的标志位以及耗时监控的采样百分比,useCostTimeStat = 1的状态下耗时监控被开启,并且以costSamplePercent的概率进行统计,默认的采样率是1%,采样率过低有可能导致btrace脚本输出没有统计结果的情况,采样率过高则会影响性能本身。 10 | 脚本中包含几个统计点如下图所示: 11 | ![18_performance_checkpoint](pic/2.18_performance_checkpoint.png) 12 | 通过执行[btrace](https://github.com/btraceio/btrace)监控正在运行的dble,可以获得类似以下的结果图: 13 | 14 | ![18_performan_result](pic/2.18_performan_result.png) 15 | 以上输出值有效信息为Block,Invocations,WallTime.* , 而SelfTime.*由于btrace的原因 不准确,可以忽略。 16 | 其中通过记录一个查询在每个记录点的时间点来观察是否存在某个中间步骤耗时过长,并进行针对性的优化和调整 17 | 18 | #### 2.18.1.2 节点描述 19 | + **0** : 逻辑时间0,来自客户端的请求首次被dble接收到的时间点 20 | + **1.startProcess** : 开始处理前端请求的时间节点 21 | + **2.endParse** : SQL被解析完成的时间节点 22 | + **3.endRoute** : SQL被路由完成的时间节点 23 | + **3.05 readyToDeliver** : SQL准备开始下发的时间点 24 | + **4.resFromBack** : 前端请求首次由任意个后端连接返回信息 25 | + **4.X.resFromBack** : 前端请求后端连接的首个返回包的采样时间点,例:4.3.resFromBack指的是第三个后端连接首次返回包给dble的时间点,具体的后端连接的编号为首次返回的顺序,即首个有网络包返回的后端连接编号为1 26 | + **5.startExecuteBackend** : 前端请求后端连接首个包进入处理阶段的时间点 27 | + **5.X.startExecuteBackend** : 前端请求后端连接的首个包被处理的采样时间点,例:5.3.startExecuteBackend指的是第三个后端连接首次进入到后端数据处理的阶段,具体的编号为首次进入处理阶段的顺序 28 | + **5.1.allBackendConnReceive** :在复杂查询的情况下开始merage的时间点 29 | + **6.response** : 给前端开始最终返回包的时间点 30 | 31 | **注意:Btrace关于性能跟踪的脚本设计专为单一SQL模式下使用,在多个SQL混合查询的情况下,由于每个SQL涉及的采样点可能不同,会出现数据上的异常,甚至是节点顺序和时间点倒挂的现象** 32 | #### 2.18.1.3 调整策略 33 | + 1-0的耗时增长:需增大bootstrap.cnf中frontWorker的值 34 | (其中0比表示dble开始读到某条语句时的时间,即初始值:0,所以1-0的时间就是request->1.startProcess的输出值,不需要进行计算) 35 | + 4-3的耗时增长:需增大bootstrap.cnf中NIOBackendRW的值 36 | + 5-4的耗时增长:需增大bootstrap.cnf中backendWorker的值 37 | 38 | ### 2.18.2 Manager命令观察 39 | 40 | #### 2.18.2.1 观察 41 | Dble 在18.02.0版本中新添加了manager端口的性能观测命令,可以通过命令查看各个线程的负载情况,需要配合在配置文件bootstrap.cnf中的新增参数useThreadUsageStat进行使用 42 | 使用命令show @@thread_used会返回各个dble中关键线程最近时间的负载情况,如下示例 43 | ![18_show_thread_used_result](pic/2.18_show_thread_used_result.png) 44 | 45 | + BussinessExecutor**X** 46 | 面向前端的业务处理线程,主要处理前端请求的解析,sql解析路由,下发查询到mysql实例等 47 | + backendWorker**X** 48 | 面向后端的业务处理线程,主要处理后端mysql查询结果的返回解析,结果聚合,并发回结果到client 49 | + $\_NIO\_REACTOR\_FRONT\_**X** 50 | 前端请求接受线程,负责请求的接收和读取,之后把数据处理交给BussinessExecutor进行 51 | + $\_NIO\_REACTOR\_BACKEND\_**X** 52 | 后端请求接收线程,负责mysql返回信息的接收和读取,之后把数据交给backendWorker处理 53 | 54 | #### 2.18.2.2 调整策略 55 | 当输出的统计结果中,有一个或者多个类型的线程使用率过高(经验值为超过80%),可以适当调整对应的处理线程的数量 56 | 57 | + NIOFrontRW 参数控制前端\_NIO\_REACTOR\_FRONT\_**X**的数量 58 | + NIOBackendRW 参数控制后端\_NIO\_REACTOR\_BACKEND\_**X**的数量 59 | + backendWorker 参数控制backendWorker**X**数量 60 | + frontWorker 参数控制BussinessExecutor**X**数量 61 | 62 | 63 | -------------------------------------------------------------------------------- /2.Function/2.19_reload_diff.md: -------------------------------------------------------------------------------- 1 | ## 2.19 智能计算reload 2 | 3 | 我们对reload @@config_all 做了重构,增加了对dbGroup/dbInstance的变化计算,使得reload行为对整个系统的影响变到最小。 4 | 5 | 变更名称的dbGroup/dbInstance,等效于删除旧的dbGroup/dbInstance,新增新的dbGroup/dbInstance 6 | 7 | ### 2.19.1 默认reload @@config_all 8 | 连接池行为描述: 9 | #### 2.19.1.1 不变的dbGroup 10 | 此种情况下,dbGroup连接不发生变化,如果关联的schmea发生变更,在需要使用时候进行连接新建或者偷取并同步上下文的方式进行更新。 11 | 12 | #### 2.19.1.2 新增的dbGroup 13 | 建立新的连接池供使用 14 | 15 | #### 2.19.1.3 删除的dbGroup 16 | 遍历当前连接池,如果没有事务正在使用连接,则回收,否则放回后端待回收连接池 (在show @@backend中可以看到放入回收池的时间),等事务结束时候连接被关闭 17 | 18 | 待回收的连接可以通过[ 2.0.1.32 recycling_resource](./2.001_manager_dble_information.md) 查询到 19 | 20 | #### 2.19.1.4 新增的dbInstance 21 | 不影响正在使用的连接,新增之后建立新的连接池供使用 22 | 23 | #### 2.19.1.5 变更的dbInstance 24 | 以往空闲的连接会直接关闭,正在使用中的连接会延迟关闭(可以通过[ 2.0.1.32 recycling_resource](./2.001_manager_dble_information.md) 查询到),也会根据变更后的配置建立新的连接池供使用 25 | 26 | #### 2.19.1.6 删除的dbInstance 27 | 以往空闲的连接会直接关闭,正在使用中的连接会延迟关闭(可以通过[ 2.0.1.32 recycling_resource](./2.001_manager_dble_information.md) 查询到) 28 | 29 | ### 2.19.2 reload @@config_all -f 30 | 强制回收所有正在使用的链接 31 | 连接池行为描述: 32 | #### 2.19.2.1 不变的dbGroup/dbInstance 33 | 此种情况下,dbGroup/dbInstance连接不发生变化,正在使用的连接会被回收 34 | 35 | #### 2.19.2.2 新增的dbGroup/dbInstance 36 | 建立新的连接池供使用 37 | 38 | #### 2.19.2.3 删除的dbGroup/dbInstance 39 | 遍历如果当前连接池,如果没有事务正在使用连接,则回收,否则关闭对应的前端连接以及相关的后端连接 40 | 41 | ### 2.19.3 reload @@config_all -r 42 | 不计算dbGroup/dbInstance的变化,相当于原本所有的连接池会被删除,然后新建所有的连接池 43 | 44 | 遍历旧连接池,如果没有事务正在使用连接,则回收,否则放回后端待回收连接池 (在show @@backend中可以看到放入回收池的时间),等事务结束时候连接被关闭 45 | 46 | 待回收的连接可以通过[ 2.0.1.32 recycling_resource](./2.001_manager_dble_information.md) 查询到 47 | 48 | ### 2.19.4 reload @@config_all -s 49 | 跳过dbGroup连接检查(与节点建立连接,连接成功,检测通过) 50 | -------------------------------------------------------------------------------- /2.Function/2.1_manager_cmd/2.1.01_select.md: -------------------------------------------------------------------------------- 1 | ### 2.1.1 select 命令 2 | 3 | #### 2.1.1.1 select @@VERSION_COMMENT 4 | ##### select @@VERSION_COMMENT; 5 | 描述:查询dble的版本信息; 6 | 例: 7 | 8 | ``` 9 | MySQL [(none)]> select @@VERSION_COMMENT; 10 | +--------------------------+ 11 | | @@VERSION_COMMENT | 12 | +--------------------------+ 13 | | dble Server (ActionTech) | 14 | +--------------------------+ 15 | 1 row in set (0.02 sec) 16 | ``` 17 | 18 | 19 | 列描述: 20 | 略 21 | 22 | #### 2.1.1.2 select @@SESSION.TX_READ_ONLY / select @@SESSION.Transaction_READ_ONLY 23 | ##### select @@SESSION.TX_READ_ONLY; 24 | ##### select @@SESSION.Transaction_READ_ONLY 25 | 描述:为了支持驱动连接管理端时下发的上下文 26 | 结果:返回管理用户是否readonly 27 | 28 | #### 2.1.1.3 select @@max_allowed_packet 29 | ##### select @@max_allowed_packet; 30 | 描述: 限制请求的包大小 31 | 特殊说明: 32 | 1.如果mysql中限制请求的包大小超过该值+1024,那么dble就不会同步该值到mysql中。所以会出现mysql max_allowed_packet和 dble中不一致的情况。 33 | 2.在客户端使用该语句依然返回的是dble在配置文件中定义的值。 34 | 3.类似其他相同作用语句比如 show variables like 'max_allowed_packet' 会下发到其中一个节点 的mysql中查询,返回结果就可能会和dble在配置文件中定义的值不一致。 35 | 4.dble中的值一定小于等于mysql中的值。 36 | 例: 37 | ``` 38 | mysql> select @@max_allowed_packet; 39 | +----------------------+ 40 | | @@max_allowed_packet | 41 | +----------------------+ 42 | | 16776640 | 43 | +----------------------+ 44 | 1 row in set (0.01 sec) 45 | ``` 46 | 47 | #### 2.1.1.4 select TIMEDIFF(NOW(), UTC_TIMESTAMP()) 48 | ##### select TIMEDIFF(NOW(), UTC_TIMESTAMP()) 49 | 描述:无实际意义,仅为了支持驱动连接管理端时下发的上下文 50 | 结果:定值,永远返回00:00:00 51 | -------------------------------------------------------------------------------- /2.Function/2.1_manager_cmd/2.1.02_set.md: -------------------------------------------------------------------------------- 1 | ### 2.1.2 set xxx 2 | 3 | #### set xxx; 4 | 其中,xxx为要设置的变量。 5 | 描述:无实际意义,仅为了支持驱动连接管理端时下发的上下文 6 | 结果:永远返回OK 7 | 8 | -------------------------------------------------------------------------------- /2.Function/2.1_manager_cmd/2.1.04_switch.md: -------------------------------------------------------------------------------- 1 | ### 2.1.4 switch命令 2 | 本小节部分自2.20.04.0 版本起废弃 3 | 4 | -------------------------------------------------------------------------------- /2.Function/2.1_manager_cmd/2.1.05_kill.md: -------------------------------------------------------------------------------- 1 | ### 2.1.5 kill命令 2 | #### 2.1.5.1 kill @@connection; 3 | 4 | ##### kill @@connection id1,id2,...; 5 | 其中,idx为 前端连接id值,可以通过show @@connection 获取。 6 | 7 | 描述:关闭存在的前端链接 ,对不存在的前端链接,不会报错 8 | 9 | 结果:返回OK,关闭的前端链接数。 10 | 11 | #### 2.1.5.2 kill @@xa_session; 12 | 13 | ##### kill @@xa_session id1,id2,...; 14 | 15 | 其中,idx为 session id值,可以通过show @@session.xa 获取。 16 | 17 | 描述:取消指定session后台重试xa事务,对不存在的session,不会报错 18 | 19 | 结果:返回OK,取消的session数量。 20 | 21 | #### 2.1.5.3 KILL @@DDL_LOCK where schema=? and table=? 22 | 23 | ##### KILL @@DDL_LOCK where schema=? and table=?; 24 | 25 | 描述:释放指定schema下table的ddl锁,详细描述可参考 [2.22 KILL @@DDL_LOCK](../2.22_kill_ddl_lock.md) 26 | 27 | 结果:返回OK。 28 | 29 | #### 2.1.5.4 kill @@load_data 30 | 31 | ##### kill @@load_data; 32 | 描述:导入文件如果发生回滚,再次导入该文件时不再跳过已经成功导入的数据会从头重新导入数据 33 | 34 | 结果:返回OK。 35 | 36 | #### 2.1.5.6 kill @@cluster_renew_thread '?' 37 | 38 | ##### kill @@cluster_renew_thread '?' 39 | 描述:当集群模式为ucore(clusterMode=ucore)时,执行分布式操作,Dble内部会起新的renewThread线程,目的以续约分布式锁,保证锁不超时 40 | 41 | 结果:返回OK。 42 | -------------------------------------------------------------------------------- /2.Function/2.1_manager_cmd/2.1.06_stop.md: -------------------------------------------------------------------------------- 1 | ### 2.1.6 stop命令 2 | #### 2.1.6.1 stop @@heartbeat 3 | 4 | ##### stop @@heartbeat keys:dbGroup; 5 | 其中:keys:dbGroup名字列表,可以是多个,用逗号隔开的key;该命令停止的是每个dbGroup的写实例。 6 | **key**:可以直接是dbGroup,也可以是dbGroup$0-n (如dbGroup$0-2实际会输出dbGroup[0],dbGroup[1],dbGroup[2],疑似BUG); 7 | **value**: 应当是个整数,单位毫秒 8 | 描述:设置dbGroup名为key的host停止heartbeat n秒 9 | 结果:返回OK 10 | 11 | ##### 注意:未作异常处理,慎用 12 | 13 | -------------------------------------------------------------------------------- /2.Function/2.1_manager_cmd/2.1.09_offline.md: -------------------------------------------------------------------------------- 1 | ### 2.1.9 offline命令 2 | #### offline; 3 | 4 | 描述:设置dble处于离线状态, 之后外部对dble的ping命令,select user,心跳都会返回错误。 5 | 问题:其他查询未处理,合理性需要考量 6 | 结果:OK 7 | 8 | -------------------------------------------------------------------------------- /2.Function/2.1_manager_cmd/2.1.10_online.md: -------------------------------------------------------------------------------- 1 | ### 2.1.10 online命令 2 | #### online; 3 | 4 | 描述:设置dble处于在线状态,与offline相反 5 | 结果:OK 6 | 7 | -------------------------------------------------------------------------------- /2.Function/2.1_manager_cmd/2.1.13_dryrun.md: -------------------------------------------------------------------------------- 1 | ### 2.1.13 配置检查命令dryrun 2 | 背景;当我们修改配置之后并且reload之前,可以通过dryrun来检查配置的正确性。 3 | 4 | 举例,当这样一个sharding.xml 准备reload时,先观察dryrun结果: 5 | sharding.xml: 6 | ``` 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 4 32 | 1 33 | 34 | 35 | 36 | 2 37 | 1 38 | 39 | ``` 40 | 41 | dryrun结果如下: 42 | ``` 43 | mysql> dryrun; 44 | +------+---------+-----------------------------+ 45 | | TYPE | LEVEL | DETAIL | 46 | +------+---------+-----------------------------+ 47 | | Xml | WARNING | shardingNode dn9 is useless | 48 | | Xml | WARNING | shardingNode dn8 is useless | 49 | +------+---------+-----------------------------+ 50 | 2 rows in set (0.58 sec) 51 | ``` 52 | 53 | 列名含义: 54 | TYPE: 错误类型,比如XML表示xml配置错误,BACKEND表示后端连接错误 55 | LEVAL:错误级别:分为WARNNING 和ERROR表,一般来说WARNNING错误不影响启动和使用,但需要注意。 56 | DETAIL :错误详情 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /2.Function/2.1_manager_cmd/2.1.14_pause_resume.md: -------------------------------------------------------------------------------- 1 | ### 2.1.14 shardingNode级别的流量暂停和恢复功能 2 | 3 | 背景:当我们做部分shardingNode的拆分或者是数据重分片时,有时希望不影响到其他无关的业务所涉及到的dbGroup和shardingNode,所以希望只停下部分shardingNode的流量。 4 | #### 2.1.14.0 功能描述 5 |   pause功能会在dble不停止的状态下停止对于指定后端节点的流量,在暂停期间的所有涉及到节点的路由结果会被挂起(为防止挂起的连接过多,queue和wait_limit参数会控制挂起连接的数量和时间),直到恢复命令resume被执行之后,之前被挂起的查询才会继续进行 6 |   pause的执行不一定成功,pause命令将会先获取分布式锁,然后在指定的timeout的时间内等待需要暂停的流量上的所有事务或者正在执行的sql结束,当目标节点上来自dble的sql或者事务一直无法在指定时间内结束的时候,本次暂停会返回失败。 7 |   pause(暂停)是一种dble server级别的全局状态,同一时间段只能执行一个 pause 操作,暂停节点不可追加或者逐步恢复,只能一起暂停指定的一个或几个shardingNode并一起恢复流量。暂停期间执行 reload命令、dble重启、新增dble节点 均可以维持暂停状态。 8 | 这里推荐谨慎的使用暂停并选择影响的范围,推荐逐个变动暂停,reload,恢复,再进行下一个变动 9 | 10 | #### 2.1.14.1 暂停流量: 11 | `pause @@shardingNode = 'dn1,dn2' and timeout = 10 ,queue = 10,wait_limit = 10;` 12 | 13 | 参数描述: 14 | timeout:这个参数是等待涉及到的事务完成的时间,如果在到达timeout之后,仍然有事务未完成,本次pause失败,单位秒。 15 | queue:这个参数表示暂停期间的阻塞前端连接的数量,超过此数量时,前端连接建立将会发生错误。 16 | wait_limit:是针对被阻塞的每个单个的前端的时间限制,如果被阻塞了超过wait_limit的时间,将会返回错误,单位秒。 17 | 18 | 19 | #### 2.1.14.2 恢复流量: 20 | `RESUME;` 21 | 返回正常的OK 或者错误“No shardingNode paused” 22 | 23 | #### 2.1.14.3 查看当前暂停状态: 24 | 25 | `show @@pause;` 26 | 27 | ``` 28 | mysql> show @@pause; 29 | +---------------------+ 30 | | PAUSE_SHARDING_NODE | 31 | +---------------------+ 32 | | dn1 | 33 | | dn2 | 34 | +---------------------+ 35 | 2 rows in set (0.15 sec) 36 | ``` 37 | 38 | 39 | -------------------------------------------------------------------------------- /2.Function/2.1_manager_cmd/2.1.16_database.md: -------------------------------------------------------------------------------- 1 | ### 2.1.16 创建/删除物理数据库命令 2 | 3 | #### 2.1.16.1 创建物理数据库 4 | 用于dble启动后发现有些shardingNode对应的物理库还未建立,可以使用后端命令一次性建立。 5 | 命令格式: 6 | `create database @@shardingNode ='dn......'` 7 | 8 | shardingNode值支持`dn$1-4`这种形式。 9 | 10 | 当所包含的shardingNode至少有一个不在配置文件当中时,或者配置的shardingNode未被引用时,均会返回错误:shardingNode $Name does not exists. 11 | 12 | 否则会对所有 shardingNode 执行 create database if not exists $databaseName,执行完成之后返回OK。 13 | 14 | #### 2.1.16.2 删除物理数据库 15 | 用于删除某些shardingNode对应的物理库,可以使用后端命令一次性删除。 16 | 命令格式: 17 | `drop database @@shardingNode ='dn......'` 18 | 19 | shardingNode值支持`dn$1-4`这种形式。 20 | 21 | 当所包含的shardingNode至少有一个不在配置文件当中时,返回错误:shardingNode $Name does not exists. 22 | 23 | 否则会对所有 shardingNode 执行 drop database if exists $databaseName,执行完成之后返回OK。若在执行过程中发生错误,会将show @@shardingNode里面的SCHEMA_EXISTS置为false,需要用户人工确认下是否物理库已删除成功。 24 | -------------------------------------------------------------------------------- /2.Function/2.1_manager_cmd/2.1.17_check_meta_data.md: -------------------------------------------------------------------------------- 1 | ## check系列命令 2 | ### 2.1.17.0 check @@metadata 命令 3 | 4 | 用于检查meta信息是否存在以及加载的时间。 5 | 命令格式: 6 | 7 | * 第一种形式 `check @@metadata`,返回结果可能是: 8 | 1. 上一次 reload @@metadata 的datatime; 9 | 2. 上一次 reload @@config_all的datatime(注意:在配置没有变更的情况下,不会同步元数据,因此datetime是不会变化的); 10 | 3. 启动时加载meta的datatime 11 | 12 | 13 | 14 | 15 | * 第二种形式`check full @@metadata` ,并且支持以下过滤条件: 16 | * `where schema=? and table=?` 17 | * `where schema=?` 18 | * `where reload_time=‘yyyy-MM-dd HH:mm:ss’`,`where reload_time>=‘yyyy-MM-dd HH:mm:ss’`,`where reload_time<=‘yyyy-MM-dd HH:mm:ss’` 19 | * `where reload_time is null` 20 | * `where consistent_in_sharding_nodes=0` 21 | * `where consistent_in_sharding_nodes = 1` 22 | * `where consistent_in_memory=0` 23 | * `where consistent_in_memory = 1` 24 | * If no where, retrun all results. 25 | 26 | * `check full @@metadata` 结果集如下: 27 | 28 | 29 | schema|table|reload_time|table_structure|consistent_in_sharding_nodes|consistent_in_memory 30 | --|--|--|--|--|-- 31 | schema|table|2018-09-18 11:01:04| CREATE TABLE table`(.....|1|1 32 | 33 | column **table_structure** 和 `show create table`命令结果的形式一样 34 | column **consistent_in_sharding_nodes** 表示不同分片之间的一致性,0为不一致,1为一致 35 | column **consistent_in_memory** 表示内存中meta与实际后端结点的一致性,0为不一致,1为一致 36 | 37 | 当table_structure列为null时,consistent_in_sharding_nodes列和consistent_in_memory列没有意义。 38 | 当consistent_in_sharding_nodes为0时,consistent_in_memory没有意义。 39 | 40 | ### 2.1.17.1 check @@global schema = '' [and table = ''] 41 | 用于进行手动全局表检查的命令,当即触发一次特定范围的全局表检查,并且将检查结果作为返回值进行展示。 42 | 结果如下所示: 43 | ``` 44 | mysql> check @@global schema = 'testdb'; 45 | +--------+------------+-----------------------------+-------------------+ 46 | | SCHEMA | TABLE | DISTINCT_CONSISTENCY_NUMBER | ERROR_NODE_NUMBER | 47 | +--------+------------+-----------------------------+-------------------+ 48 | | testdb | tb_global1 | 0 | 0 | 49 | +--------+------------+-----------------------------+-------------------+ 50 | ``` 51 | **SCHEMA:** 所检查的SCHEMA名字 52 | **TABLE:** 所检查的TABLE名字 53 | **DISTINCT_CONSISTENCY_NUMBER:** 返回有几个不同的检查结果的版本 54 | **ERROR_NODE_NUMBER:** 在检查过程中有几个节点执行SQL报错 55 | 具体最终结果是否符合用户的预期,还是要根据表格的检查SQL和返回信息来进行判断,但一般情况下认为当DISTINCT_CONSISTENCY_NUMBER的值大于1的情况下,表格中的内容一定不一致 56 | -------------------------------------------------------------------------------- /2.Function/2.1_manager_cmd/2.1.18_release.md: -------------------------------------------------------------------------------- 1 | ### 2.1.18 release 命令 2 | #### 2.1.18.1 release @@reload_metadata 3 | 4 | 描述:打断正在进行中的reload_metadata步骤。当reload/reload config_all/reload metadata进行到最后一个步骤时,都会进行reload metadata 5 | 就经验而言这个步骤存在hang死的风险,所以当出现reload metadata步骤迟迟未返回的情况,可以使用这个命令进行终止,使得dble能够继续提供服务 6 | 结果:OK 或者ERROR 7 | 8 | **注意**: 9 | + 此命令会导致config可能和table meta不匹配的情况,若执行此命令,请务必在后面追加命令reload @@metadata更新最新的meta信息 10 | + 当一个reload过程被打断时,执行reload的进程会返回编号为5999的SQL错误,请慎重对待此错误CODE,这个错误代表着“新的配置被应用,meta信息在更新的过程中终止” 11 | + 在执行运维操作的过程中可能会需要查看dble当前的reload状态,可通过具体命令[show @@reload_status](2.1.03_show.md#21347---show-reload_status)进行查看 -------------------------------------------------------------------------------- /2.Function/2.1_manager_cmd/2.1.19_split.md: -------------------------------------------------------------------------------- 1 | ### 2.1.19 split 命令 2 | 3 | ### 背景 4 | 在进行POC时,现场人员进行数据导入时经常遇到各种问题,比较典型的是dble在导入文件时,对部分sql语句的不支持。另外,未分片的历史数据通过dble导入,旧数据会路由分片,在数据量较大时,耗时会比较长,在此过程中出现错误的话也很难排查。 5 | 基于以上原因,2.19.09.0版本提供工具对mysqldump导出的源数据文件按照后端分片节点进行分割。分割后的数据文件可以在每个后端分片执行导入,适配数据按分片导入的需求。 6 | 7 | ### dump文件语句处理 8 | 1. create database:会将逻辑数据库转换为物理库。 9 | 2. ddl语句:根据表的分片节点写入到对应后端节点的dump文件中,对于自增列,会将自增列的数据类型修改为bigint。 10 | 3. insert:全局序列列值会被dble替换为全局序列,再按照拆分列根据拆分算法路由到对应后端节点的dump文件中。 11 | 4. 一些属性设置的语句会根据最近一次解析的ddl来决定下发到具体的后端节点的dump文件中。 12 | 5. 会跳过对视图的处理 13 | 6. 会跳过对子表的处理 14 | 15 | ### 使用方法 16 | 17 | #### 命令 18 | 在管理端口执行以下命令: 19 | ```bash 20 | mysql > split src dest [-sschema] [-r500] [-w512] [-l10000] [--ignore] [-t2] 21 | 22 | - src:表示原始dump文件名 23 | - dest:表示生成的dump文件存放的目录 24 | - -s:表示默认逻辑数据库名,当dump文件中不包含schema的相关语句时,会默认导出到该schema。如:当dump文件中包含schema时,dump文件中的优先级高于-s指定的;若文件中的schema不在配置中,则使用-s指定的schema,若-s指定的schema也不在配置中,则返回报错 25 | - -r:表示设置读文件队列大小,默认500 26 | - -w:表示设置写文件队列大小,默认512,且必须为2的次幂 27 | - -l:表示split后一条insert中最多包含的values,只针对分片表,默认4000 28 | - --ignore:insert时,忽略已存在的数据 29 | - -t:表示多线程处理文件中insert语句时线程池的大小 30 | ``` 31 | 生成的分片文件以格式:源文件名-shardingNode名-时间戳.dump,最新的文件时间戳最大。 32 | 33 | 例如:我的原始dump文件是 /tmp/mysql_dump.sql ,我想切分以后输出到/tmp/dump/目录下: 34 | 命令就是: 35 | ``` 36 | split /tmp/mysql_dump.sql /tmp/dump/ 37 | ``` 38 | 39 | #### 日志 40 | 41 | 默认情况下,split过程中生成的日志打印到在dble.log中,提供配置让split命令产生的日志单独存放,若需要开启,则需修改log4j.xml文件。 42 | 43 | ```xml 44 | 45 | 46 | 47 | 49 | 50 | %d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] (%l) - %m%n 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | ``` 69 | 可通过日志中的 “dump file has bean read d%”关键字来查看解析进度。 70 | 71 | 可开启日志的debug级别来调整性能 72 | 73 | #### 任务停止 74 | 75 | 执行dump file任务的管理连接不受 idletimeout 参数的限制。用户可以通过kill @@connection id 方式杀掉管理连接从而停止dump file的任务的执行。 76 | 77 | ### 使用限制 78 | 79 | 1. 数据导入之后需要运维检查下数据完整性。 80 | 2. 对于使用全局序列的表,表原先全局序列中的值会被擦除,替换成全局序列,需要注意。 81 | 3. 暂时不支持子表的dump操作。 82 | -------------------------------------------------------------------------------- /2.Function/2.1_manager_cmd/2.1.20_flow_control.md: -------------------------------------------------------------------------------- 1 | ### 2.1.20 flow_control 命令 2 | 3 | #### 2.1.20.1 查询流量控制当前配置状态 4 | ``` 5 | mysql> flow_control @@show; 6 | +-------------------+-------------------------+------------------------+ 7 | | FLOW_CONTROL_TYPE | FLOW_CONTROL_HIGH_LEVEL | FLOW_CONTROL_LOW_LEVEL | 8 | +-------------------+-------------------------+------------------------+ 9 | | FRONT_END | 4194304 | 262144 | 10 | | dbGroup1-hostM1 | 4194304 | 262144 | 11 | | dbGroup2-hostM2 | 4194304 | 262144 | 12 | +-------------------+-------------------------+------------------------+ 13 | 1 row in set (0.00 sec) 14 | ``` 15 | 列描述: 16 | + FLOW_CONTROL_TYPE 流量控制的类型,前端连接为固定值“FRONT_END”;后段连接为所在的实例名,格式为:组名-实例名 17 | + FLOW_CONTROL_HIGH_LEVEL 流量控制的高水位线,积压队列的字节数到达此位置开始控制流量 18 | + FLOW_CONTROL_LOW_LEVEL 流量控制低水位线,积压队列的字节数低于此位置不再控制流量 19 | 20 | #### 2.1.20.2 修改流量控制当前配置状态 21 | flow_control @@set [enableFlowControl = true/false] [flowControlHighLevel = ?] [flowControlLowLevel = ?] 22 | ``` 23 | MySQL [(none)]> flow_control @@set enableFlowControl = true flowControlHighLevel= 100000 flowControlLowLevel = 30000; 24 | Query OK, 0 rows affected (0.02 sec) 25 | ``` 26 | 通过此命令可以修改对应内存中生效的值,同时会变更文件`bootstrap.dynamic.cnf` 将其固化,对应关系如下: 27 | + enableFlowControl: bootstrap.cnf中enableFlowControl参数 28 | + flowControlHighLevel:bootstrap.cnf中flowControlHighLevel参数 29 | + flowControlLowLevel:bootstrap.cnf中flowControlLowLevel参数 30 | 31 | 注:以上命令三个参数顺序不可变更 32 | 33 | #### 2.1.20.3 查看当前连接的流量控制状态 34 | ``` 35 | MySQL [(none)]> flow_control @@list; 36 | +------------------+---------------+---------------------------------------+---------------------+---------------------+-----------------+ 37 | | CONNECTION_TYPE | CONNECTION_ID | CONNECTION_INFO | WRITING_QUEUE_BYTES | READING_QUEUE_BYTES | FLOW_CONTROLLED | 38 | +------------------+---------------+---------------------------------------+---------------------+---------------------+-----------------+ 39 | | ServerConnection | 1 | 127.0.0.1:50817/schema1 user = root | 464594 | NULL | false | 40 | | MySQLConnection | 8 | 10.186.65.86:3307/db2 mysqlId = 1287 | 0 | 0 | false | 41 | | MySQLConnection | 12 | 10.186.65.86:3308/db1 mysqlId = 1557 | 0 | 0 | false | 42 | | MySQLConnection | 6 | 10.186.65.86:3307/db1 mysqlId = 1285 | 0 | 86172 | false | 43 | | MySQLConnection | 15 | 10.186.65.86:3308/db2 mysqlId = 1559 | 0 | 0 | false | 44 | +------------------+---------------+---------------------------------------+---------------------+---------------------+-----------------+ 45 | 46 | ``` 47 | 列描述: 48 | + CONNECTION_TYPE 连接的类型,固定为MySQLConnection/ServerConnection其中之一 49 | + CONNECTION_ID 连接在dble中的ID信息,可以通过ID查找日志 50 | + CONNECTION_INFO 连接详细信息,使用端口,IP地址,用户,MySQL中的连接ID等 51 | + WRITING_QUEUE_BYTES 当前连接的准备写出的队列里积压的字节数 52 | + READING_QUEUE_BYTES 当前连接的已经读取的队列里积压的字节数,前端连接不支持此功能,恒为null 53 | + FLOW_CONTROLLED 当前连接是否处于被流控的状态 54 | 55 | 如果需要过滤结果集,可以使用dble_information.dble_flow_control 来过滤 56 | -------------------------------------------------------------------------------- /2.Function/2.1_manager_cmd/2.1.21_fresh_conn.md: -------------------------------------------------------------------------------- 1 | ## 2.1.21 刷新后端连接池 2 | 3 | ### 2.1.21.1 介绍&背景 4 | 当在后端mysql做全局变量/权限等的变更时,需要dble的连接池进行一次重新建立,新建的连接才会有新的属性。 5 | 6 | ### 2.1.21.2 命令 7 | #### fresh conn [forced] where dbGroup ='groupName' [and dbInstance='instanceName']; 8 | 9 | * 不包含forced时,则空闲的后端连接直接丢弃,而正在使用的后端连接等归还后丢弃 10 | * 包含forced时,则无论空闲还是正在使用的后端连接都直接丢弃;另外正在使用的后端连接对应的前端连接也会全部断开 11 | * 不指定dbInstance时,则dbGroup下所有的dbInstance都将刷新 12 | * 指定dbInstance时,多个dbInstance以逗号隔开,则刷新dbGroup下指定的dbInstance 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /2.Function/2.1_manager_cmd/2.1.22_detach_cluster.md: -------------------------------------------------------------------------------- 1 | ## 2.1.22 脱离集群 命令 2 | 3 | + [背景](#1-0) 4 | + [介绍](#2-0) 5 | + [命令](#3-0) 6 | - [cluster @@detach](#3-1) 7 | - [cluster @@attach](#3-2) 8 | + [伪集群模式下的限制](#4-0) 9 | - [阻塞等待](#4-1) 10 | - [无法执行](#4-2) 11 | - [不一致问题](#4-3) 12 | + [术语解释](#5-0) 13 | 14 | **以下内容只针对集群状态下的 dble 有效。** 15 | 16 | ### 2.1.22.1 背景 17 | 18 | 在部分场合下,集群状态下的 dble 可能需要临时断开和集群中心(指zookeeper/ucore)的连接。 19 | 20 | 典型的应用场景是:集群中心需要进行升级/维护时。 21 | 22 | 在版本<3.21.10 , 唯一的方式是配置修改为单机版并重新启动 dble;需要加回来时,改会原来的配置并重启 dble。但这对业务影响很大,通常在生产环境下难以接受。 23 | 24 | ### 2.1.22.2 介绍 25 | 26 | 在版本≥3.21.10,dble提供了一个脱离集群的指令,可以在不重启的情况下,临时断开和集群中心的连接,让 dble 以一个 伪集群模式 的单实例方式运行。 27 | 28 | 之所以叫做 伪集群,因为他的状态和 普通的单机版dble 不同, dble 会认为自己还是处于集群状态,操作方式还是和集群方式相同,只是没法和集群通讯。他执行一些集群相关指令(含义见2.1.22.4) 29 | 会报错,比如`reload @@config`。 30 | 31 | ### 2.1.22.3 命令 32 | 33 | #### cluster @@detach [timeout=10] 34 | 35 | * 脱离集群,断开和集群中心的连接。 36 | * 在执行完 脱离集群指令后,在加入集群之前,集群相关指令(含义见2.1.22.4)将不可用且报错:"cluster is detached" 37 | * 可以指定 timeout 单位是秒,默认是 10s,不建议设置过大,因为会阻塞其他指令。 38 | 39 | #### cluster @@attach [timeout=10] 40 | 41 | * 唯一用途:脱离集群的逆操作。用于重新加入集群。恢复和集群中心的连接 42 | * 可以指定 timeout 单位是秒,默认是 10s,不建议设置过大,因为会阻塞其他指令。 43 | 44 | ### 2.1.22.4 伪集群模式下的限制 45 | 46 | #### 2.1.22.4.1 阻塞等待 47 | 48 | 脱离集群 指令分为三个阶段。 49 | 50 | 1. 预备阶段 51 | 2. 执行阶段 52 | 3. 执行完成 53 | 54 | 在第一步预备阶段,如果有先来的 集群相关指令或者管理端(9066执行的)指令 正在执行,则 脱离集群指令 会阻塞等待这些指令完成,或者阻塞超时了直接返回报错。因为脱离集群和这些指令并发可能有风险。 55 | 56 | 在第一步预备阶段和第二步执行阶段,如果有后来的 集群相关指令或者管理端(9066执行的)指令 即将执行,则这些指令会阻塞等待,直到 脱离集群 指令完成。因为脱离集群和这些指令并发可能有风险。 57 | 58 | 简单来说,脱离集群指令会被 集群相关指令或者管理端(9066执行的)指令 阻塞,集群相关指令或者管理端(9066执行的)指令 会被 脱离集群 阻塞。为了防止 集群相关指令或者管理端(9066执行的)指令被阻塞太久影响实际使用,建议 59 | timeout超时时间不宜配置太长。 60 | 61 | 加入集群 指令 同上。 62 | 63 | #### 2.1.22.4.2 无法执行 64 | 65 | 在执行完 脱离集群指令后,在加入集群之前,集群相关指令将不可用且报错:"cluster is detached"。这是合理的,因为此时和集群不通讯,所以无法完成进一步操作。 66 | 67 | #### 2.1.22.4.3 不一致问题 68 | 69 | 在执行完 脱离集群指令后,如果集群内的其他节点执行 集群相关指令,将正常执行,但是,将不会对该节点产生任何影响,因为收不到消息。 此时,集群外和集群内的 dble 很有可能状态不一致,即使后续重新加入了集群,但是dble 仍不能保证一致性。 70 | 71 | 比如,集群中有 A,B,C 三个节点。节点 A 脱离了集群,节点 B 加入了一张表t1并进行reload,此时节点C和节点B的信息一致,均包含 表t1,但是节点A收不到消息,不会 reload 也不知道 表t1 的存在。在这个时间点,A 和 72 | B 不一致。在这之后,节点 A 重新加入了集群,但是A 已经错过了 reload 事件,不会进行 reload ,依旧是和 B 不一致。 73 | 74 | 因此不建议在 脱离集群后加入集群前 这个时间点执行集群相关指令。 如果已经做了,请手动确认一致性。 75 | 76 | ### 2.1.22.5 术语解释 77 | 78 | 集群相关指令 指的是 使用了集群元数据的指令,主要是 https://actiontech.github.io/dble-docs-cn/2.Function/2.08_cluster.html 79 | 提到的指令。包括以下这些(可能信息更新不及时,具体以链接里提到的为主) 80 | 81 | - DDL 82 | - reload @@config 83 | - show @@binlog.status 84 | - 创建view 85 | - 高可用命令同步 86 | - 暂停流量 87 | - xa 日志的commit/rollback 88 | - 全局序列中采用的”分布式offset-step方式“实现的 table 的插入语句 89 | 90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /2.Function/2.1_manager_cmd/2.1.23_thread_cmd.md: -------------------------------------------------------------------------------- 1 | ### 2.1.23 thread 命令 2 | 3 | #### 2.1.23.1 print线程信息 4 | ``` 5 | mysql> thread @@print; -- 打印所有线程的信息 6 | Query OK, 0 rows affected (0.03 sec) 7 | Please see logs in logs/thread.log 8 | 9 | mysql> thread @@print name='0-frontWorker'; -- 打印指定线程信息 10 | Query OK, 0 rows affected (0.00 sec) 11 | Please see logs in logs/thread.log 12 | ``` 13 | 14 | #### 2.1.23.2 kill线程 15 | ``` 16 | mysql> thread @@kill name='0-frontWorker'; -- 中断单个线程 17 | Query OK, 0 rows affected (0.00 sec) 18 | Please see logs in logs/thread.log 19 | 20 | mysql> thread @@kill poolname='Timer'; -- 中断线程池(目前仅支持Timer、TimerScheduler) 21 | Query OK, 0 rows affected (0.00 sec) 22 | Please see logs in logs/thread.log 23 | ``` 24 | 25 | #### 2.1.23.3 recover线程 26 | ``` 27 | mysql> thread @@recover name='0-frontWorker'; -- 恢复单个线程 28 | Query OK, 0 rows affected (0.00 sec) 29 | Please see logs in logs/thread.log 30 | 31 | mysql> thread @@recover poolname='Timer'; -- 恢复线程池(目前仅支持 Timer、TimerScheduler) 32 | Query OK, 0 rows affected (0.00 sec) 33 | Please see logs in logs/thread.log 34 | ``` -------------------------------------------------------------------------------- /2.Function/2.22_kill_ddl_lock.md: -------------------------------------------------------------------------------- 1 | ## 2.22 KILL @@DDL_LOCK 2 | 3 | ### 背景 4 | 在运维dble集群的过程中,有时会遇到 " There is other session is doing DDL " 或者 "xxx is doing DDL " 等问题,这些问题会导致某些表无法被操作,无法进行 reload 等。此时,需要人工干预保证集群运行正常。 5 | 6 | ### 逻辑判断 7 | 8 | 在 dble 集群中,可以通过 ZK 中某些键值对推断正在执行 DDL 的节点状态,比如通过键 universe/dble/{cluster-id}/ddl/{schema.table} 的值内容推断。该值理论上只会被发起者节点所修改,其他节点会订阅该键值,该值的内容为json格式,其中有一个 status 字段: 9 | 10 | 1. status 为 INIT 时,发起动作的节点会锁住本节点对应 table 的 table meta并获取当前key的分布式锁。其他的dble节点订阅到该值后会锁住本节点上对应 table 的 table meta; 11 | 12 | 2. 待发起节点执行DDL之后,会根据 DDL 执行结果更新当前键的值,此时根据 DDL 执行结果 status 分为两种情形:SUCCESS 和 FAILED。其他节点订阅到 status 为 SUCCESS 时,才会真正执行对应的DDL操作,否则会取消执行DDL并释放本节点对应table 的 table meta 锁; 13 | 14 | 3. 每个节点都会插入一条 universe/dble/{cluster-id}/ddl/{schema.table}/{dble-id}:SUCCESS 数据。 15 | 16 | 17 | 到此,除发起者的节点执行已经结束,但是发起者节点会等待其他节点响应,只有全部节点都汇报执行完成之后,当前ddl才算完成。 18 | 19 | 发起者节点通过什么来判断其他节点都响应完成?根据以下两个键的内容: 20 | 21 | - universe/dble/{cluster-id}/ddl/{schema.table}/{dble-id} 22 | 23 | - universe/dble/{cluster-id}/online/下属结点 24 | 25 | 26 | 所有执行当前DDL操作的节点都会在universe/dble/{cluster-id}/ddl/{schema.table}/ 下面插入记录,发起节点通过判断 online 节点是否在 universe/dble/{cluster-id}/ddl/{schema.table}/ 下面留下记录判断 DDL 是否被该节点所应用。只有两者相符合时,ddl才算真正意义上的完成。 27 | 28 | 此时,发起者会释放 table meta 锁 和 分布式锁,并且删除 `universe/dble/{cluster-id}/ddl/{schema.table}` kv 树。 29 | 30 | 31 | 32 | ### kill ddl_lock 33 | 当前指令只会释放对应ddl在当前节点中所持有的元数据锁,但是不会影响执行该ddl的线程的状态。 34 | 若出现上述问题,可以参考 上面如何判断其他节点都响应完成的方式找出哪些没有响应,在这些节点和发起节点上执行当前命令,并手动删除universe/dble/{cluster-id}/ddl/{schema.table} kv 树。 35 | 36 | ##### 注意事项 37 | 38 | 1. 需要注意kill指令的执行顺序:先在各个从节点上执行该指令,最后再在主节点上执行。 39 | 2. 如果不是特殊因素,此命令请不要随意使用。 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /2.Function/2.23_outerHa_linkage.md: -------------------------------------------------------------------------------- 1 | ## 2.23 外部高可用联动 2 | * [2.23.1 外部后端MYSQL-HA连接](2.23_outerHa_linkage/2.23.1_outerHa_linkage_overview.md) 3 | * [2.23.2 命令的使用说明](2.23_outerHa_linkage/2.23.2_command_usage.md) 4 | * [2.23.3 命令的实现细节](2.23_outerHa_linkage/2.23.3_Logical_detail.md) 5 | * [2.23.4 简单的HA交互使用案例](2.23_outerHa_linkage/2.23.4_mha_sample.md) -------------------------------------------------------------------------------- /2.Function/2.23_outerHa_linkage/2.23.1_outerHa_linkage_overview.md: -------------------------------------------------------------------------------- 1 | # 2.23.1 外部后端MYSQL-HA连接 2 | 3 | dble在版本2.19.09.0开始提供对应的外部接口,基于以下几个基础要点进行设计: 4 | + 外部HA组件能够通过一定的方式和dble进行信息的主动沟通(包括脚本,网络通信,命令等方式) 5 | + 外部HA组件能够做出对与MYSQL可用性的明确判断(包括哪些节点停流量,哪些节点主从切换,哪些节点启动流量) 6 | 7 | 在基于以上的两个条件的情况下,基于提供外部接口通用性以及易用性的考虑,决定通过管理端用户命令的方式添加对应的交互接口,具体的提供以下的三个交互接口: 8 | + 停止流量命令(dbGroup @@disable) 9 | + 启动流量命令(dbGroup @@enable) 10 | + 主从切换命令(dbGroup @@swtich) 11 | 12 | 其次为了方便进行管理和观测,提供了一个当前切换状态的查询命令: 13 | + 切换状态查询命令(dbGroup @@events) 14 | 15 | 外部HA组件可以通过 mysql命令、脚本调用mysql命令、或者程序的DB连接执行mysql命令的方式进行交互。 16 | 同时此功能设计考虑到zk集群用户的需求,当用户使用zk集群状态下的dble进行高可用切换时,会有集群的联动机制,外部HA组件只需要通知其中一个节点即可。 17 | 18 | 以下提供一个外部HA和dble交互设计图: 19 | ![overview](pic/2.23_overview.png) 20 | 21 | 更加详细的情况请查询以下文档: 22 | [命令的使用说明](2.23.2_command_usage.md) 23 | [命令的实现细节](2.23.3_Logical_detail.md) 24 | [简单的HA交互使用案例](2.23.4_mha_sample.md) 25 | 26 | -------------------------------------------------------------------------------- /2.Function/2.23_outerHa_linkage/2.23.2_command_usage.md: -------------------------------------------------------------------------------- 1 | # 2.23.2 dbGroup命令的具体使用方法和解释 2 | 3 | ## 外部ha启用参数 4 | 当项目准备使用dble的外部ha联动方式来完成高可用切换或者同步的时候,需要提前进行如下配置 5 | 6 | ### bootstrap.cnf 中的对应参数 7 | ``` 8 | -DuseOuterHa=true 9 | ``` 10 | 11 | *注意:本参数的调整需要重启dble服务* 12 | 13 | ### cluster.cnf 的对应参数 14 | needSyncHa = true 15 | + 当此参数启用时,集群状态的dble将会在集群中同步自身的dbGroup的状态 16 | + 此配置会强制将bootstrap.cnf 中的useOuterHa设置为true 17 | + 当bootstrap.cnf 中的useOuterHa但cluster.cnf的needSyncHa不为true时,dble可以执行高可用切换的所有指令,但是其行为退化为单机dble,需要人工进行集群中多个dble的状态同步 18 | 19 | *注意:此参数的调整需要重启集群内的所有dble服务* 20 | 21 | ### 关于dble中对于后端MySQL状态的解释 22 | dbInstance的状态“disabled/enable”仅表示dble层面对于具体每个MySQL后端节点是否允许有流量的标识,和具体的MySQL存活状态无关 23 | ## dbGroup @@disable 24 | 命令细节: 25 | dbGroup @@disable name = 'dbGroup_name' [instance = 'instance_name'] 26 | 27 | + 其中的dbGroup_name指的是在db.xml中配置的dbGroup的名称,而instance_name指的是在一个dbInstance的name 28 | + 当此命令不指定instance = '..'的内容时,默认将此dbGroup下所有dbInstance的状态置为disabled 29 | + 被标记为disabled的节点无法提供正常的查询,即使对应的mysql真实的存活着 30 | + 具体的dbInstance的disable状态可以通过管理端命令show @@dbInstance进行查询 31 | + 若当前dble服务尚存连接被disable的连接,在命令执行过程中会被全部关闭,包括正在新建过程中的连接,可能会导致少量的查询报错 32 | + 关闭连接的策略为对于使用中的连接先从池中删除,后续由定时任务(时间周期固定为5s)进行关闭;而空闲的连接则会直接关闭 33 | + 由于连接关闭策略具有延迟性,可能会导致disable命令返回结果后,后端连接实际上还没有关闭 34 | 35 | ## dbGroup @@enable 36 | 命令细节: 37 | dbGroup @@enable name = 'dbGroup_name' [instance = 'instance_name'] 38 | 39 | + 其中的dbGroup_name指的是在db.xml中配置的dbGroup的名称,而instance_name指的是在一个dbInstance的name 40 | + 当此命令不指定instance = '..'的内容时,默认将此dbGroup下所有dbInstance的状态置为enable 41 | 42 | 43 | ## dbGroup @@switch 44 | 命令细节: 45 | dbGroup @@switch name = 'dbGroup_name' master = 'instance_name' 46 | 47 | + 其中的dbGroup_name指的是在db.xml中配置的dbGroup的名称,而instance_name指的是在一个dbInstance的name 48 | + 此命令name和master内容都为必填,在缺少任意元素的状态下会报错 49 | + 此命令的作用会导致dbGroup下的标记为primary的dbInstance发生重置,也就是写节点会发生变化 50 | + 此命令不会导致所有dbInstance节点的disable状态变化,但如果命令使得一个dbInstance从primary退化成为非primary,此dbInstance上的所有既有连接都会被关闭,以确保新的写请求不会被写入到错误的dbInstance上面去,这可能导致一些前端连接的查询报错和事务失败 51 | 52 | -------------------------------------------------------------------------------- /2.Function/2.23_outerHa_linkage/2.23.3_Logical_detail.md: -------------------------------------------------------------------------------- 1 | # 2.23.3 高可用联动命令的逻辑细节 2 | 3 | ## 简述 4 | 在dble高可用协同的几个接口中基本逻辑都是相似的,只是去更新dbGroup的属性,只不过在细节上每个命令都有一些自身的特殊行为 5 | + disable命令在执行过程中会断开当前所有连接,并且在zk集群状态下会要求其他节点同步响应 6 | + enable命令没有任何附加行为 7 | + switch命令会在切换过程中断开旧primary dbInstance的所有连接 8 | 9 | 10 | ## dbGroup @@disable 11 | dble在单机情况下大致逻辑如下: 12 | 13 | + 检查命令参数是否符合条件 14 | + 更新dbInstance的状态 15 | + 关闭所有已经存在的连接 16 | + 同步更新配置文件,将dbGroup的最新状态落盘 17 | + 返回OK信息 18 | 19 | ![overview](pic/2.23.2_disable_single.png) 20 | 21 | 在集群状态下的逻辑有所不同: 22 | 23 | + 检查命令参数是否符合条件 24 | + 更新dbInstance的状态 25 | + 关闭所有已经存在的连接 26 | + 异步更新配置文件,将dbGroup的最新状态落盘 27 | + 将最新的dbGroup的状态信息同步到zk上 28 | + 写出一个zk上面的key任务,等待其他节点响应 29 | + 其他节点响应任务,更新自身写出响应结果 30 | + 发起dble检查所有响应结果,等待所有节点响应完成 31 | + 返回最终的执行结果 32 | 33 | ![overview](pic/2.23.2_disable_cluster.png) 34 | 35 | 36 | ## dbGroup @@enable 37 | 38 | dble在单机情况下的逻辑大致如下: 39 | + 检查命令参数是否符合条件 40 | + 更新dbInstance的状态 41 | + 同步更新配置文件,将dbGroup的最新状态落盘 42 | + 返回OK信息 43 | 44 | ![overview](pic/2.23.2_enable_single.png) 45 | 46 | 在ZK集群的状况下逻辑大致如下: 47 | 48 | + 检查命令参数是否符合条件 49 | + 更新ddbInstance的状态 50 | + 关闭所有已经存在的连接 51 | + 异步更新配置文件,将dbGroup的最新状态落盘 52 | + 将最新的dbGroup的状态信息同步到zk上 53 | + 写出一个zk上面的key任务,等待其他节点响应 54 | + 其他节点响应任务,更新自身写出响应结果 55 | + 发起dble检查所有响应结果,等待所有节点响应完成 56 | + 返回最终的执行结果 57 | 58 | ![overview](pic/2.23.2_enable_cluster.png) 59 | 60 | ## dbGroup @@switch 61 | 62 | dble在单机情况下的其逻辑大致如下: 63 | + 检查命令参数是否符合条件 64 | + 更新dbInstance的状态 65 | + 关闭旧primary dbInstance的所有连接 66 | + 同步更新配置文件,将dbGroup的最新状态落盘 67 | + 返回OK信息 68 | 69 | ![overview](pic/2.23.2_switch_single.png) 70 | 71 | 在ZK集群的状况下逻辑大致如下: 72 | 73 | + 检查命令参数是否符合条件 74 | + 更新dbInstance的状态 75 | + 关闭所有已经存在的连接 76 | + 异步更新配置文件,将dbGroup的最新状态落盘 77 | + 将最新的dbGroup的状态信息同步到zk上 78 | + 写出一个zk上面的key任务,等待其他节点响应 79 | + 其他节点响应任务,更新自身写出响应结果 80 | + 发起dble检查所有响应结果,等待所有节点响应完成 81 | + 返回最终的执行结果 82 | 83 | ![overview](pic/2.23.2_switch_cluster.png) 84 | -------------------------------------------------------------------------------- /2.Function/2.23_outerHa_linkage/pic/2.23.2_disable_cluster.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/2.23_outerHa_linkage/pic/2.23.2_disable_cluster.png -------------------------------------------------------------------------------- /2.Function/2.23_outerHa_linkage/pic/2.23.2_disable_single.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/2.23_outerHa_linkage/pic/2.23.2_disable_single.png -------------------------------------------------------------------------------- /2.Function/2.23_outerHa_linkage/pic/2.23.2_enable_cluster.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/2.23_outerHa_linkage/pic/2.23.2_enable_cluster.png -------------------------------------------------------------------------------- /2.Function/2.23_outerHa_linkage/pic/2.23.2_enable_single.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/2.23_outerHa_linkage/pic/2.23.2_enable_single.png -------------------------------------------------------------------------------- /2.Function/2.23_outerHa_linkage/pic/2.23.2_switch_cluster.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/2.23_outerHa_linkage/pic/2.23.2_switch_cluster.png -------------------------------------------------------------------------------- /2.Function/2.23_outerHa_linkage/pic/2.23.2_switch_single.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/2.23_outerHa_linkage/pic/2.23.2_switch_single.png -------------------------------------------------------------------------------- /2.Function/2.23_outerHa_linkage/pic/2.23.4_container_overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/2.23_outerHa_linkage/pic/2.23.4_container_overview.png -------------------------------------------------------------------------------- /2.Function/2.23_outerHa_linkage/pic/2.23.4_service_overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/2.23_outerHa_linkage/pic/2.23.4_service_overview.png -------------------------------------------------------------------------------- /2.Function/2.23_outerHa_linkage/pic/2.23_overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/2.23_outerHa_linkage/pic/2.23_overview.png -------------------------------------------------------------------------------- /2.Function/2.24_timeout_control.md: -------------------------------------------------------------------------------- 1 | # 2.24 超时(连接/执行)控制 2 | 3 | ## 概述 4 | 在dble中连接分为两种,前后端连接,分别对应客户端连接dble的网络连接和dble中连接mysql的网络连接 5 | 大致的情况如下图所示: 6 | ![connection_type](pic/2.23_front_back_connection.png) 7 | 由于网络TCP连接的特性,dble中需要对于这两种连接都有超时控制,具体在dble中将连接的超时控制分为:**前端连接无响应超时**、**后端连空闲超时**和**后端连接执行超时** 8 | ;当超时发生的时候,dble会通过切断超时连接的方法进行控制。 9 | 10 | ## 超时的检查和实现 11 | 在配置文件bootstrap.cnf中存在三个配置项 12 | + sqlExecuteTimeout(后端连接执行超时) 13 | + idleTimeout(前端连接无响应超时) 14 | + processorCheckPeriod(超时检查周期) 15 | 16 | 以下描述具体超时检查的实现逻辑 17 | + dble按照配置的processorCheckPeriod作为周期去周期性检查所有的连接 18 | + 检查所有后端连接,若满足以下条件就关闭后端连接 19 | - 此后端连接已经被某个前端连接借走(正在执行或持有) 20 | - 此后端连接距离上一次收发包超过sqlExecuteTimeout 21 | - 此后端连接没有在执行DDL或者执行xa事务 22 | + 检查所有前端连接,若满足以下条件就关闭前端连接 23 | - 此前端连接正在执行xa事务,并不处于commit失败补偿/rollback失败补偿 24 | - 此前端连接距离上一次收发包超过idleTimeout 25 | 26 | **综上总结为超时关闭连接的逻辑可以描述为:** 27 | + 后端连接非DDL,XA事务的情况下被前端连接借走,并且超过sqlExecuteTimeout没有收发包(包括普通事务执行间隔,后端连接被长期持有的时间超时) 28 | + 前端连接非XA事务特殊阶段,超过idleTimeout没有收发包(包括在loaddata大文件过程中发生的长时间空档) 29 | 30 | 31 | ## SQL执行超时注意事项 32 | + 部分语言或者框架的连接池会长期持有连接,并且没有设定或者定时发送网络包,可能会导致空闲的连接自动断开,然后应用在取用到对应断开连接的时候可能会报错 33 | + 当开启一个事务但是长期不执行SQL会导致后端连接被判断定为执行超时,当应用再次在连接上执行内容的时候,会给出后端连接已关闭的报错信息 34 | + 当前端连接执行一个大文件内容load data的时候,由于后端可能执行较慢,前端连接存在超过idleTimeout导致连接关闭的情况,当有类似数据导入计划的时候,考虑暂时放宽idleTimeout的限制 35 | + 连接的超时检查和关闭是通过一个循环来实现的,所以并不是一个实时检查的值,最坏的情况对于超时的检查会迟到一个processorCheckPeriod周,当应用对于SQL超时需要一个严格的时间设定时,请谨慎使用 -------------------------------------------------------------------------------- /2.Function/2.25_flow_control.md: -------------------------------------------------------------------------------- 1 | # 2.25 dble流量控制 2 | ## 背景 3 | 在之前的dble版本中,当进行大文件load以及大结果集查询的过程中,都有可能由于数据的发送不及时造成数据在dble内存中堆积,当条件足够的时候甚至有可能造成dble服务的OOM,进而影响服务的稳定运行。 4 | 在最初2.20.04中由社区开发者@ssxlulu提供了对于这部分流量控制的实现,通过连接级别的写队列长度,进行数据加载/获取的负反馈调节,从而实现在数据load和大结果集查询过程中的内存使用情况稳定,在此基础上,我们又做了一些改进。 5 | 6 | 7 | ## 原理 8 | 9 | dble中的流量控制通过连接级别的写出队列进行负反馈调节,具体在生效的时候分成两种具体的形式: 10 | + Load data过程: 11 | - 后端连接写出队列积压字节数过大,大于后端链接的高水位(flowHighLevel)时,写出线程暂停,等积压字节被写出,降低到低水位(flowLowLevel)后恢复。逻辑示意图如下: 12 | ![实现逻辑](pic/2.25_flow_control_load.png) 13 | 14 | + Select过程: 15 | - 前端连接写出队列积压字节数过大(比如中间件和客户端之间网络不好可能会造成此现象),大于高水位(flowControlHighLevel),后端MySQL连接开始流量控制,停止读数据 16 | - 当MySQL已读取的数据队列积压,积压的字节数过大(比如中间件和mysql在同一机器上),大于后端连接的高水位(flowHighLevel),后端mysql连接开始流量控制,停止读数据 17 | - 当前端连接写出队列积压字节数小于低水位(flowControlLowLevel)并且后端连接读取积压字节数小于低水位(flowLowLevel),后段mysql连接停止流量控制,开始读数据 18 | - 逻辑示意图如下: 19 | ![实现逻辑](pic/2.25_flow_control_select.png) 20 | 21 | *注:流量控制功能的生效级别为连接级别,不同连接之间的队列长度不会互相影响,另外只有在nio下此功能才有效* 22 | 23 | 24 | ## 使用举例 25 | 26 | 本功能为默认关闭功能,需要在bootstrap.cnf中进行相关配置进行显式开启,或者通过管理端的辅助命令进行实时的调整。 27 | 在bootstrap.cnf中使用下列参数使得功能开启并生效: 28 | ``` 29 | enableFlowControl(是否开启流量控制开关) 30 | flowControlHighLevel(写队列上限阈值,写队列超限时开启流量控制) 31 | flowControlLowLevel(写队列下限阈值,写队列低于阈值时取消流量控制) 32 | ``` 33 | 34 | + 修改参数的管理命令为: 35 | `flow_control @@set [enableFlowControl = true/false] [flowControlHighLevel = ?] [flowControlLowLevel = ?]` 36 | 37 | + 后端属性flowLowLevel和flowHighLevel在连接池属性处配置,可以通过重载命令等来配置或者修改,开关也由bootstrap.cnf的enableFlowControl控制。 38 | 39 | + 展示当前流控配置参数信息: 40 | - `flow_control @@show `. 41 | 42 | + 展示连接是否正在被流量控制: 43 | - flow_control @@list 44 | - 如果需要过滤结果集,可以使用`dble_information.dble_flow_control`(与`flow_control @@list`等价) 来过滤 45 | -------------------------------------------------------------------------------- /2.Function/2.26_cap_client_found_rows.md: -------------------------------------------------------------------------------- 1 | ## 2.26 开启/关闭client_found_rows权能标志 2 | 3 | ### 2.26.1 介绍&背景 4 | 在客户端与服务器在初次连接的时候,服务端发送初始化握手包时会带上自己所支持的[权能标志](https://dev.mysql.com/doc/internals/en/capability-flags.html);客户端接收后会对服务器发送的权能标志进行筛选,保留自身所支持权能标志且返回给服务器,从而保证服务器与客户端通讯的兼容性。因此权能标志是在初次连接确定,不能动态修改。 5 | 在DBLE中后端连接都是使用连接池预先建立好的,导致与前端请求不同导致行为不一样;因此在dble管理端中新增了对client_found_rows权能标志更改和后端连接池的刷新。 6 | 7 | #### 2.26.1.1 client_found_rows的作用 8 | 若初次连接handshake协议中启用client_found_rows权能标志,表示在DML等操作时结果集里返回发现行(found rows),而不是影响行(affect rows)。 9 | 10 | #### 2.26.1.2 client_found_rows值设定: 11 | MYSQL客户端:默认关闭client_found_row;(则返回结果集里为affect rows) 12 | JDBC:默认开启client_found_rows;(则返回结果集里为found rows) 13 | 14 | 15 | #### 2.26.1.3 JDBC中useAffectedRows与client_found_row的关系 16 | useAffectedRows=true 即关闭client_found_rows 17 | useAffectedRows=false(默认) 即开启client_found_rows 18 | 19 | ### 2.26.2 具体 20 | 21 | #### 2.26.2.1 在bootstrap.cnf里增加参数 22 | ``` 23 | #是否开启client_found_rows权能标志,默认关闭 24 | -DcapClientFoundRows=false 25 | ``` 26 | 27 | #### 2.26.2.2 管理端口增加命令 28 | ``` 29 | show @@cap_client_found_rows; -- 查询client_found_row权能标志开启状态 0-关闭 1-开启 30 | disable @@cap_client_found_rows; -- 关闭client_found_row权能标志 31 | enable @@cap_client_found_rows; -- 开启client_found_row权能标志 32 | ``` 33 | 注意: 如果在不停dble服务的情况下,更改该权能标志,为了保证与后端连接的mysql的该权能标志一致,(强调)需要[刷新连接池](2.1_manager_cmd/2.1.21_fresh_conn.md);否则insert的结果集不正确 34 | 35 | ### 2.26.3 验证 36 | 37 | step1. 启动dble(默认关闭client_found_rows) 38 | 39 | step2. 管理用户身份开启client_found_rows权能标志 40 | ``` 41 | mysql -uman1 -h192.xx.xx.xx -P9066 -p654321 42 | enable @@cap_client_found_rows; 43 | ``` 44 | step3. 用户身份尝试登录 45 | 46 | * 在3.20.10.0版本中,登录失败,提示客户端与dble内存中的client_found_rows权能标志不一致 47 | ``` 48 | mysql -uroot -h192.xx.xx.xx -P8066 -p123456 49 | ERROR 1045 (HY000): The client requested CLIENT_FOUND_ROWS capabilities does not match, in the manager use show @@cap_client_found_rows check latest status. 50 | ``` 51 | * 在3.20.10.1及后续版本,登录成功,但会在dble.log中提示客户端与dble内存中的client_found_rows权能标志不一致,此时返回结果以dble的client_found_rows值为准 52 | ``` 53 | the client requested CLIENT_FOUND_ROWS capabilities is 'found rows', dble is configured as 'affect rows',pls set the same. 54 | or 55 | the client requested CLIENT_FOUND_ROWS capabilities is 'affect rows', dble is configured as 'found rows',pls set the same. 56 | ``` 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /2.Function/2.27_general_log.md: -------------------------------------------------------------------------------- 1 | ## 2.27 general日志 2 | 3 | ### 2.27.1 介绍 4 | 开启general日志会将所有到达dble的sql语句以(仅支持)file方式记录; 5 | 开启后性能损耗在3%~5%,不需要观察下发sql情况时建议关闭该功能 6 | 7 | 已知问题: 8 | 1.执行Execute包时,dble接收的long data数据将以16进制形式打印在general日志中 9 | 2.读写分离用户,执行Execute包,不将sql打印出来(原因;读写分离实际相当于sql的中转站,中途不做任何数据的保留) 10 | 11 | 12 | #### 2.27.2 bootstrap.cnf中general log相关配置 13 | ``` 14 | # dble存放各种文件的父目录,假设当前路径为/tmp/ 15 | -DhomePath=. 16 | 17 | # 开启general long,默认关闭;0-关闭,1-开启 18 | #-DenableGeneralLog=1 19 | 20 | # general log文件的路径,默认general/general.log;若设置以'/'开头的值则作为绝对路径生效,反之,则在homepath后拼接值得到最终绝对路径;比如: 21 | # 若设值为general/general.log,则最终文件绝对路径为:/tmp/general/general.log 22 | # 若设值为/general/general.log,最终文件绝对路径为:/general/general.log 23 | #-DgeneralLogFile=general/general.log 24 | 25 | # 触发翻转的文件大小,默认16,以mb为单位;当超过16MB则将general.log翻转为yyy-MM/general-MM-dd-%d.log的格式文件 26 | #-DgeneralLogFileSize=16 27 | 28 | # 内部实现机制用到的队列大小,值必须为2的次方,默认4096 29 | #-DgeneralLogQueueSize=4096 30 | ``` 31 | 32 | 33 | #### 2.27.3 管理端命令 34 | #### 2.27.3.1 show @@general_log 35 | 查询general的开关和路径信息;另外也可以使用use dble_information; select * from dble_variables where variable_name like '%general%'; 36 | ``` 37 | show @@general_log; 38 | +------------------+---------------------------------------+ 39 | | NAME | VALUE | 40 | +------------------+---------------------------------------+ 41 | | general_log | ON | 42 | | general_log_file | /tmp/./general/general.log | 43 | +------------------+---------------------------------------+ 44 | 2 rows in set (0.03 sec) 45 | ``` 46 | #### 2.27.3.2 disable @@general_log 47 | 关闭general log 48 | ``` 49 | disable @@general_log; 50 | Query OK, 1 row affected (0.02 sec) 51 | disable general_log success 52 | ``` 53 | 54 | #### 2.27.3.3 enable @@general_log 55 | 开启general log 56 | ``` 57 | enable @@general_log; 58 | Query OK, 1 row affected (0.02 sec) 59 | enable general_log success 60 | ``` 61 | #### 2.27.3.4 reload @@general_log_file=? 62 | 重置general log的文件路径 63 | ``` 64 | reload @@general_log_file='/tmp/dble-general/general/general.log'; 65 | Query OK, 1 row affected (0.00 sec) 66 | reload general log path success 67 | ``` 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /2.Function/2.29_load_data.md: -------------------------------------------------------------------------------- 1 | ## 2.29 load data批处理模式 2 | 3 | ### 2.29.1 介绍 4 | 在使用load data导数据时,如果期间发生网络超时等异常状况就会导致load data产生回滚。所以引入了”分批导入“的处理方式:将需要导入的文件按照阈值(见bootstrap.cnf)拆分成多个文件进行分批导入,这样在load data途中发生异常状况时,已经成功已导入的文件不会被回滚,并会停止导入发生异常后的文件。再次基于源文件的load data,DBLE则会跳过已成功导入的文件继续load data。此外,在开启批处理模式后,如果待导入的文件按照既定load data语法规则(或不符合表结构等)存在错误,DBLE会停止load data并会展示该文件错误的sql语句的内容,待错误修复后,再次load data仍会跳过已导入的数据,从而节约时间成本。 5 | 注意: 6 | 1.如果文件发生错误, 只有文件修改完成并且正确导入后或者使用kill @@load_data,/temp/error 下的文件才会被删除。 7 | 2.如果文件发生错误,在修改文件内容时修改了文件名称会被视为新文件重新导入。 8 | 3.每次导入文件会删除上次导入遗留的内容(如上次生成的错误文件等)。 9 | 4.错误文件命名方式为:数字-文件名-表名-下发节点名.txt,比如1-data-table-dn1.txt。1代表文件分割后的第一个文件,data为导入的文件名称,table代表插入的表名,dn1代表该文件需要下发的节点。 10 | 11 | #### 2.29.2 bootstrap.cnf中load data批处理模式的相关配置 12 | ``` 13 | # 开启BatchLoadData的开关,默认关闭;0-关闭,1-开启 14 | #-DenableBatchLoadData=1 15 | # 拆分文件的阈值,默认为100000 16 | #-DmaxRowSizeToFile=100000 17 | ``` 18 | 19 | #### 2.29.3 管理端命令 20 | #### 2.29.3.1 show @@load_data.fail 21 | 查询本次load data失败的文件 22 | ``` 23 | show @@load_data.fail; 24 | Empty set (0.01 sec) 25 | 26 | if have error file may like 27 | show @@load_data.fail; 28 | +-----------------------------------+ 29 | | error_load_data_file | 30 | +-----------------------------------+ 31 | | ./temp/error/1-data-table-dn1.txt | 32 | | ./temp/error/1-data-table-dn2.txt | 33 | +-----------------------------------+ 34 | 2 rows in set (0.01 sec) 35 | ``` 36 | #### 2.29.3.2 disable @@load_data_batch 37 | 关闭load data批处理模式 38 | ``` 39 | disable @@load_data_batch; 40 | Query OK, 1 row affected (0.00 sec) 41 | disable load_data_batch success 42 | ``` 43 | 44 | #### 2.29.3.3 enable @@load_data_batch 45 | 开启load data批处理模式 46 | ``` 47 | enable @@load_data_batch; 48 | Query OK, 1 row affected (0.01 sec) 49 | enable load_data_batch success 50 | ``` 51 | #### 2.29.3.4 reload @@load_data.num=? 52 | 修改需要持久化的最大行数,在开启load data批处理模式下是拆分文件的阈值 53 | ``` 54 | reload @@load_data.num=200000; 55 | Query OK, 1 row affected (0.00 sec) 56 | reload @@load_data.num success 57 | ``` 58 | 59 | #### 2.29.5 kill @@load_data 60 | 导入文件如果发生回滚,再次导入该文件时不再跳过已经成功导入的数据会从头重新导入数据 61 | ``` 62 | kill @@load_data; 63 | Query OK, 1 row affected (0.00 sec) 64 | kill @@load_data success 65 | ``` 66 | -------------------------------------------------------------------------------- /2.Function/2.2_global_sequence/2.2.1_MySQL-offset-setp.md: -------------------------------------------------------------------------------- 1 | ### 2.2.1 MySQL offset-step方式 2 | MySQL offset-step方式利用了数据库的并发和并发更新互斥的特性。 3 | 在数据库中建立一张表,保存序列的当前值和步长,使用该序列时,系统从表中读取序列的当前值,加上步长,返回给客户端的同时更新表中的当前值。 4 | 线程获取序列的执行步骤如下: 5 | 6 | 1. 检查是否有请求序列未用的缓存的序列值,如果没有,执行步骤2;否则,执行步骤4。 7 | 2. 到相应的数据节点上执行 8 | SELECT dble_seq_nextval(\'**seqName**\'); 9 | 其中, **seqName**为请求序列的序列名。此步骤获取的序列值数依赖于该序列的步长**increment**,为区间[current_value, current_value+increment)中的值。 10 | 3. 缓存步骤2得到的序列值。 11 | 4. 返回缓存的序列值中第一个未用的序列值。 12 | 13 | 以上提到的部分配置内容参见[1.7.1 offset-step方式](../../1.config_file/1.7_global_sequence/1.7.1_MySQL-offset-setp.md) 14 | 15 | 16 | -------------------------------------------------------------------------------- /2.Function/2.2_global_sequence/2.2.2_timestamp.md: -------------------------------------------------------------------------------- 1 | ### 2.2.2 时间戳方式 2 | 这种方式下,全局序列在dble服务实例本地产生,只能生成全局唯一的ID,不能实现连续自增。 3 | 使用这种方式需要对应字段为bigint来保证63位(63位的原因是Java没有无符号整数类型,所以最高位恒为0,保证全局序列是个正数) 4 | 序列值是63bits的整数。整数的位模式如下: 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
a.29bitsb.10bitsc.12bitsd.12bits
15 | 16 | 17 | 18 | 其中, 19 | + a - e为从高位到低位。 20 | + a为系统当前时间戳的低41位中的高29位。 21 | + b为10位instance id,使用bootstrap.cnf的instanceId 22 | + c为12位自增长值 23 | + d为系统当前时间戳的低41位中的低12位。 24 | 25 | 26 | 注意事项: 27 | 1. bootstrap.cnf的instanceId的最大值均为1023。 28 | 2. 每毫秒时间内允许的最多序列值为4095。为了保证序列值的唯一性,在毫秒时间内请求超过4095个序列值时系统会进行等待到下一毫秒开始。 29 | 3. 因为java没有无符号整数,实际使用41位时间戳相对于1288834974657L(2010年左右)的偏移量。 30 | 4. 相对于偏移量的处理过够后的41位时间戳可供使用69年。 31 | 32 | 33 | -------------------------------------------------------------------------------- /2.Function/2.2_global_sequence/2.2.3_distribute_timestamp.md: -------------------------------------------------------------------------------- 1 | ### 2.2.3 分布式时间戳方式 2 | 本方式提供一个基于Zookeeper(也可以本地配置)的分布式ID生成器,可以生成全局唯一的63位二进制ID。 3 | PS:63位的原因是Java没有无符号整数类型,所以最高位恒为0,保证全局序列是个正数 4 | 5 | #### 2.2.3.1 位模式 6 | 7 | 序列值是63bits的整数。整数的位模式如下: 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
a.9bitsb.9bitsc.6bitsd.39bits
17 | 18 | 19 | 其中: 20 | 21 | + a - e为从高位到低位。 22 | 23 | + a为线程id的低9位值。 24 | 25 | + b为9位实例 id值(根据配置, 此值为bootstrap.cnf的instanceId值或者从zookeeper服务器获取的值, 参见[1.7.3 分布式time序列](../../1.config_file/1.7_global_sequence/1.7.3_distribute_timestamp.md))。 26 | 27 | 28 | + c为6位自增长值 29 | 30 | + d为系统当前时间戳的低39位值(可以使用17年)。 31 | 32 | #### 2.2.3.2 退化的分布式时间序列 33 | 如果cluster.cnf中的sequenceInstanceByZk值不为true, 序列的维护仅依赖于单实例(bootstrap.cnf的instanceId值的维护),此时序列类似于时间戳方式(参见[2.2.2 时间戳方式](2.2.2_timestamp.md))。 34 | 35 | #### 2.2.3.3 分布式时间序列 36 | 如果cluster.cnf中的sequenceInstanceByZk值为true,序列的维护用zookeeper的临时自增节点来维持。每次生成全局序列时,向zk申请一个临时自增节点,通过计算自增节点数 % 32 获取INSTANCEID. 37 | 38 | -------------------------------------------------------------------------------- /2.Function/2.2_global_sequence/2.2.4_distribute_offset-step.md: -------------------------------------------------------------------------------- 1 | ### 2.2.4 分布式offset-step方式 2 | 分布式offset-step方式利用zookeeper的分布式锁功能进行实现。 3 | 4 | 线程在获取序列值时执行如下步骤: 5 | 6 | 1. 根据序列名(\`**schemaX**\`\.\`**tableX**\`)获取相应的分布式锁。 7 | 8 | 2. 从zookeeper服务器上获取未用序列值的最小值min。 9 | 10 | 3. 根据配置(参见[1.7.4 分布式offset-step序列](../../1.config_file/1.7_global_sequence/1.7.4_distribute_offset-step.md)),计算能获取的最大未用序列值max。 11 | 12 | 4. 用max+1更新zookeeper服务器上的未用序列值的最小值min。 13 | 14 | 5. 释放相应的分布式锁。 15 | 16 | -------------------------------------------------------------------------------- /2.Function/2.32_analysis_user.md: -------------------------------------------------------------------------------- 1 | ## 2.32 分析用户 2 | 3.22.01.0版本dble支持单纯使用分析用户 3 | 4 | ### 2.32.1 分析用户配置 5 | 6 | #### 2.32.1.1 单纯使用分析用户功能的配置 7 | 仅需在 user.xml 文件中配置 analysisUser并指定对应的dbGroup即可。dbGroup的配置参考db.xml的章节。这里需要注意的是四种用户配置的顺序是固定的。user.xml的配置请参考user.xml章节。 8 | ```xml 9 | 10 | 11 | 12 | 13 | 14 | 15 | ``` 16 | 17 | 18 | 配置注意事项: 19 | 1. 当user.xml文件中不配置shardingUser,dble不再加载sharding.xml配置文件(即dble不具备分表分库),包括集群情况下出现sharding.xml不一致,均属于已知现象。 20 | 2. 多个analysisUser可以引用同一个dbGroup。 21 | 3. 被用户使用的dbGroup内的instance才会有心跳和连接池;未被有效使用的dbGroup内的instance只有心跳,不会初始化连接池。 22 | 23 | 24 | ### 2.32.2 负载均衡 25 | 26 | dble通过配置多个dbInstance为读操作提供负载均衡,注意的是rwSplitMode配置不为0,详细请参见db.xml章节。负载均衡规则如下: 27 | 28 | 1. 确定参与读写分离的dbInstance集合 29 | 2. 负载均衡算法 30 | 31 | #### 2.3.2.1 确定参与读写分离的dbInstance集合 32 | 33 | 该算法在每次连接获取时提供可用的dbInstances实例集 34 | + 写节点(primary="true")可用 35 | - rwSplitMod配置为2,则写节点有资格参到读写分离,将写节点加入到dbInstances实例集 36 | - 读节点(primary没配置或者 primary="false") 37 | + 节点可用且需要进行延迟检测,检查延迟是否在阈值内再决定是否加入到dbInstances实例集 38 | + 节点可用且不需要进行延迟检测,直接加入到dbInstances实例集 39 | + 写节点异常 40 | - 检查读节点是否可用,与上面读节点的检测机制一致 41 | 42 | 43 | #### 2.32.2.2 负载均衡算法 44 | 45 | 该算法在dbInstance集合中选择一个dbInstance实例来获取连接。 46 | 47 | + dbInstance集合为空,前端报错。 48 | + dbInstance集合非空 49 | - 每个dbInstance有权重设置(readWeight参数), 但不都是等值权重, 依权重随机选择。 50 | - 每个dbInstance无权重设置或所有权重等值, 则等权随机选择。此种情况只是上面情况的特例。 51 | 52 | #### 2.32.2.3 写节点是否参与均衡与dbGroup的rwSplitMode属性有关,具体见下图 53 | 54 | ![rwSplitMode](pic/2.3_rwSplitMode.png) 55 | 56 | ### 2.32.3 分析用户支持语句类型 57 | 按照clickhouse对于mysql语法的兼容,对于select语句,dble目前都能支持 58 | 59 | ### 2.32.4 分析用户功能限制 60 | 1. 目前仅支持clickhouse 61 | 2. 目前支持select语句,其他类型语句dble不保证正确性 62 | 3. 分析用户不支持带库名直接登录 63 | -------------------------------------------------------------------------------- /2.Function/2.34_security/overview.md: -------------------------------------------------------------------------------- 1 | # 2.34 dble安全加密 2 | 3 | 默认情况下,前侧应用与dble之间采用非加密连接,因此第三方可以在网络层面抓取协议包并解析,从而查看交互的数据,包含查询的语句、结果等,那么就会造成数据库中数据的泄露。 4 | 5 | 为了解决以上提到的数据可能泄露的问题,参考MySQL加密方式,dble同样支持启用基于TLS协议的加密连接,前侧使用MySQL Client、MySQL驱动都可以连接加密后的DBLE。 6 | 7 | 关于加密方式如何配置请参考以下: 8 | * [2.34.1 SSL自签名证书生成](./2.34.1_generate_certificate.md) 9 | * [2.34.2 DBLE启用SSL](./2.34.2_configure_SSL.md) -------------------------------------------------------------------------------- /2.Function/2.37_sql_dump_log.md: -------------------------------------------------------------------------------- 1 | ## 2.37 审计日志/sql_dump log 2 | 3 | ### 2.37.1 介绍 4 | 在读写分离(或者分析)用户中,方便观察SQL在DBLE中具体下发到某个后端实例,耗时等信息; 5 | 局限性:分表分库用户不参与审计日志的记录 6 | 7 | ### 2.37.2 日志格式 8 | 9 | `[时间][SQL digest hash][SQL类型][事务ID][影响行数][用户][前端IP:端口][后端IP:端口][执行时间] SQL文本内容` 10 | + [时间]:执行完后,日志记录的时间;精确到毫秒 11 | + [SQL digest hash]: SQL摘要信息的hash值 12 | + [SQL类型] :SQL类型;一般有:Insert、Update、Delete、Select、Show、DDL、Begin、Commit、Rollback等,其余为Other 13 | + [事务ID]:是一根前侧连接级别的事务累加的计数器;同一根前侧连接中,事务ID相同的语句视为同一事务内的语句 14 | + [影响行数]:返回的行数 15 | + [用户]:用户名称(:租户名称) 16 | + [前端IP:端口]:客户端的IP和PORT 17 | + [后端IP:端口]:用到的后端连接对应的物理库所在的IP和PORT 18 | + [执行时间]:SQL执行耗时;以毫秒为单位 19 | + SQL文本内容:截取SQL的1024长度用于展示 20 | 21 | ### 2.37.3 相关配置 22 | ``` 23 | -DenableSqlDumpLog=0 # 开关,0-关闭(默认),1-开启 24 | -DsqlDumpLogBasePath=sqldump # base路径 25 | -DsqlDumpLogFileName=sqldump.log # 日志文件名,生成日志的相对路径:sqldump/sqldump.log 26 | -DsqlDumpLogCompressFilePattern=${date:yyyy-MM}/sqldump-%d{MM-dd}-%i.log.gz ## 压缩日志文件命名格式,如:sqldump/2022-10/sqldump-10-11-1.log.gz(精度为:天) 27 | -DsqlDumpLogOnStartupRotate=1 # 每次重启,是否触发日志翻转;1-是,0-否 28 | -DsqlDumpLogSizeBasedRotate=50MB # 当sqldump.log文件大小达到50MB,触发日志翻转;单位可以为:KB、MB、GB 29 | -DsqlDumpLogTimeBasedRotate=1 # 间隔天数,触发日志翻转;如:1,则每天会进行反转 30 | -DsqlDumpLogDeleteFileAge=90d # 对过期90天内的压缩文件进行删除,单位可以为:d(天)、h(时)、m(分)、s(秒);(注意,精度单位需要与sqlDumpLogCompressFilePattern保持一致,否者可能不生效;原因:基于log4j2的实现,存在这个现象 31 | -DsqlDumpLogCompressFilePath=*/sqldump-*.log.gz # 过期的文件压缩匹配 32 | ``` 33 | 34 | ### 2.37.4 相关命令 35 | ``` 36 | enable @@sqldump_sql; -- 开启 37 | disable @@sqldump_sql; -- 关闭 38 | select * from dble_variables where variable_name like '%sqldump%'; -- 查询sqldump相关的变量 39 | ``` 40 | 41 | ### 2.37.5 其他 42 | 0、SQL在DBLE中执行,但没有实际下发到后端实例,则不参与记录 43 | 1、Exit、Quit 语句不参与记录 44 | 3、COM_STMT_PREPARE 不参与统计,COM_STMT_EXECUTE参与统计 45 | 4、执行多语句,也参与记录 46 | 5、DBLE内部语法依赖于Druid,若Druid不支持的语法且需要脱敏处理,因此暂时无法展示sql模版,“SQL文本内容”部分均由“Other”代替展示 47 | 6、审计日志基于log4j2的实现 48 | 49 | -------------------------------------------------------------------------------- /2.Function/2.38_tcp_parameter.md: -------------------------------------------------------------------------------- 1 | ## 2.38 tcp相关参数 2 | 3 | ### 2.38.1 介绍 4 | dble在启动时会创建与mysql通信的连接池,但是这些连接可能在tcp三次握手时由于某些情况丢失了第三次握手的信息。此时这些连接被mysql直接丢弃, 5 | 而在dble侧并无感知,导致dble的连接池的连接的数量达不到预期设置的值,导致dble出现异常。为了解决这个问题,linux本身就有keep-alive机制, 6 | 并提供对应参数控制,但是这是系统级别参数,一旦直接修改可能影响其他应用影响面较大。dble在bootstrap.cnf中提供相关参数配置并且只影响dble内的连接。 7 | 8 | ### 2.38.2 jdk版本要求 9 | oracle jdk 1.8-261及其以上版本 10 | openjdk 1.8-272及其以上版本 11 | 12 | ### 2.38.3 相关配置 13 | ``` 14 | -DtcpKeepIdle=30 #启用tcp-keepalive连接检测的连接空闲时间 15 | -DtcpKeepInterval=10 #启用tcp-keepalive连接检测的时间间隔 16 | -DtcpKeepCount=3 #启用tcp-keepalive检测启用后的最大重试次数 17 | ``` 18 | ### 2.38.4 使用场景 19 | 1.检测并关闭tcp三次握手中丢失了第三次握手信息导致的半连接 20 | 2.检测挂掉的连接,如导致连接挂掉的原因很多,如服务停止、网络波动、宕机、应用重启等 21 | 3.防止因为网络不活动而断连,如使用NAT代理或者防火墙等 22 | 23 | ### 2.38.5 注意事项 24 | 1.dble会在启动的时候校验jdk版本,如果版本不符合要求dble会给出相应warn日志,并且配置文件的这三个参数不会生效,dble可以正常启动 25 | 2.该功能属于试用功能,可能导致后端连接异常断开,可通过调大tcpKeepIdle,tcpKeepInterval,tcpKeepCount的值来规避问题 26 | 27 | -------------------------------------------------------------------------------- /2.Function/2.5_distribute_transaction/2.5.1_XA_trans_overview.md: -------------------------------------------------------------------------------- 1 | ### 2.5.1 XA事务概述 2 | 3 | #### 2.5.1.1 XA事务概述 4 | 5 | 普通事务只能在单节点内部保证事务的完整性,如果事务要在不同的节点上执行,无法保证数据一致性,具有跨节点的数据一致性要求的场景需要使用2阶段协议实现分布式事务。 6 | 由于以上普通事务的缺陷所以Dble引入了Mysql的XA事务来解决这个问题,MySQL5.7之前版本的XA事务存在一些问题,启用需要MySQL 5.7版本,否则无法保证数据不丢失。dble提供的分布式事务采用两阶段提交协议,目前还是弱XA事务,不能绝对保证跨节点数据的强一致性。 7 | 8 | 1. 事务开始前需要设置手动提交:set autocommit=0; 9 | 2. 使用命令开启XA 事务:set xa=on; 10 | 3. 执行相应的SQL 语句。 11 | 4. 对事务提交或者回滚,事务结束:commit/rollback; 12 | 13 | 分布式事务的性能开销比较大,所以只推荐在全局表的事务以及其他一些对一致性要求比较高的场景中使用。一般情况下尽量不要在同一个事务中运行跨节点的SQL语句。 dble支持大事务,但一方面大事务会造成事务执行时间上升,事务信息规模扩大,导致系统性能下降;另一方面,大事务也容易造成潜在的事务数据不一致问题。因此,大事务一定要谨慎使用,一般建议单个事务的 SQL 语句不要超过100条。 14 | 15 | 以下提供一个JDBC使用XA事务的实例,注意,此例子为最简单的demo,切勿直接在生产环境上使用。 16 | 生产环境需要一些更健壮的代码,比如使用连接池(连接重用)时,在放回连接池之前需要将系统变量设置回初始值。 17 | ``` 18 | public class XaDemo { 19 | 20 | public static final String URL = "jdbc:mysql://localhost:8066/testdb"; 21 | //在这里也可以使用jdbc:mysql://127.0.0.1:8066?sessionVariables=xa=1 22 | //进行替代,在这种情况下不需要执行set xa = 1 23 | public static final String USER = "root"; 24 | public static final String PASSWORD = "123456"; 25 | 26 | public static void main(String[] args){ 27 | try { 28 | //1.加载驱动程序 29 | Class.forName("com.mysql.jdbc.Driver"); 30 | //2. 获得数据库连接 31 | Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); 32 | //3.操作数据库,实现增删改查 33 | Statement stmt = conn.createStatement(); 34 | stmt.execute("set xa = 1"); 35 | //开始一个xa事务 36 | stmt.execute("begin"); 37 | try { 38 | //执行相关数据操作的时候需要对于可能出现的错误进行catch 39 | //并在错误出现的时候对于整个事务进行rollback 40 | stmt.execute("insert into xa_test set id = 11,name = '3333'"); 41 | stmt.execute("insert into xa_test set id = 22,name = '333'"); 42 | stmt.execute("insert into xa_test set id = 3,name = '33'"); 43 | //数据执行完成提交 44 | stmt.execute("commit"); 45 | }catch (Exception e){ 46 | System.out.println(" error "+e); 47 | //如果在数据操作的时候出现错误,将整个事务的操作回滚 48 | stmt.execute("rollback"); 49 | }finally { 50 | stmt.close(); 51 | conn.close(); 52 | } 53 | 54 | }catch(Exception e){ 55 | 56 | } 57 | } 58 | } 59 | ``` 60 | 61 | #### 2.5.1.2 XA事务的基础 62 |   xa事务基于mysql5.7的xa事务的特性,其流程和特性由以下图所示: 63 | 64 | ![](pic/2.5.2.png) 65 | 66 | -------------------------------------------------------------------------------- /2.Function/2.5_distribute_transaction/2.5.2_XA_trans_commit&rollback.md: -------------------------------------------------------------------------------- 1 | ### 2.5.2 XA事务的提交以及回滚 2 | #### 2.5.2.1 XA事务的提交 3 | 4 | 在Dble中采用二段提交的方式对于XA事务进行提交 5 | 具体的逻辑可见下图 6 | 7 | ![](pic/2.5.3.png) 8 | 9 | 整体来说的处理原则如下: 10 | 1. 将XA事务的提交分为END PREPARE COMMIT三个部分 11 | 2. 如果在PREPARE下发之前有节点失败或报错,关闭所有后端连接放弃事务数据 12 | 3. 如果在PREPARE下发过程中发生失败,则回滚事务,所有节点下发ROLLBACK 13 | 4. 如果在COMMIT节点发生失败,则尝试重新下发,几次尝试未果将事务交给定时任务来继续重试 14 | 15 | #### 2.5.2.2 XA事务的回滚 16 | 相对来说回滚的逻辑就容易的多,直接在所有节点下发rollback。如果失败,直接关闭失败的连接。 17 | 18 | ![](pic/2.5.4.png) 19 | 20 | #### 2.5.2.3 XA事务重试机制 21 | 22 | 2.19.03.0之前的dble版本对于失败的事务,策略是将事务交给定时任务后台进行无限重试。2.19.03.0版本对这一过程进行了可配置化,并提供管理命令控制这一过程。 23 | 24 | ##### 2.5.2.3.1 配置 25 | 26 | 2.19.03.0版本可以通过bootstrap.cnf文件中的xaRetryCount属性配置xa后台重试策略: 27 | 28 | 1. 当 xaRetryCount 等于0时,后台无限重试 29 | 2. 当 xaRetryCount 大于0时,后台尝试次数达到xaRetryCount后,重试停止且发送告警 30 | 31 | 若重试失败,会发出一条告警,重试成功后自动解决相应告警。 32 | 33 | ##### 2.5.2.3.2 相关命令 34 | 35 | 2.19.03.0版本新增两个管理命令 36 | 1. 通过`show @@session.xa` 查看后台重试xa事务信息 37 | 2. 通过 `kill @@xa_session id1,id2...`取消指定session后台尝试xa事务 38 | 39 | ##### 2.5.2.3.3 实现细节 40 | 41 | 重试时会先从后端连接池中获取连接,如果重试失败,相对应的连接会被关闭回收,更糟糕是重试多次都失败的话,有可能池内的连接都会被回收,此时就会新建后端连接来进行重试 42 | -------------------------------------------------------------------------------- /2.Function/2.5_distribute_transaction/2.5.3_XA_trans_make_up.md: -------------------------------------------------------------------------------- 1 | ### 2.5.3 XA事务的后续补偿以及日志清理 2 | 3 | #### 2.5.3.1 XA事务的补偿逻辑 4 | 由于XA事务是通过多次提交来达成最终的提交和回滚的,所以就会出现由于服务下线或者其他原因导致的提交或是回滚任务被执行了一半 5 | 在这种情况发生的时候dble通过XA事务记录的日志进行日志的处理以及补偿 6 | 详细通过在dble重启的时候在重启之前对于XA日志进行读取,并根据里面的内容对于XA事务进行回滚或者补偿 7 | 具体的补偿流程如下图所示: 8 | 9 | ![](pic/2.5.5.png) 10 | 11 | 注:XA事务的补偿不保证所有事务都能在补偿期间正确提交,若补偿期间依然因为SQL执行造成失败,只会在dble普通日志中体现或者告警(如果有配置告警功能) 12 | 13 | #### 2.5.3.2 XA事务的日志清理逻辑(xaLogClean) 14 | xa事务的日志只保存最近一段时间的,所以需要有定期的清理已经正确提交或者是正确回滚的日志数据 15 | 会根据bootstrap.cnf中的配置信息xaLogCleanPeriod定时将没有后续作用的数据做清除 16 | 17 | #### 2.5.3.3 XA事务定期连接检查(xaSessionCheck) 18 | 在dble提供服务期间如果发生commit(狭义commit,特指XA事务中prepare之后的commit动作)失败或者是rollback失败,那么失败的事务将被存储到内存队列中 19 | 并且进行定时的提交或回滚,直到事务被正确的提交或回滚 20 | 这是由于在xa事务的逻辑中prepare全部完成之后的事务已经都被成功持久化,仅需要提交即可 21 | 22 | -------------------------------------------------------------------------------- /2.Function/2.5_distribute_transaction/2.5.5_normal_trans_overview.md: -------------------------------------------------------------------------------- 1 | ### 2.5.5 一般分布式事务概述 2 | 在分布式事务中整体的逻辑和mysql的事务逻辑类似,通过长期持有的连接来进行,每个前端连接frontconnection对应一个session,在dble的每个session中有对应的事务状态以及session所持有的后端连接集合target,在非事务状态下或者是autocommit状态下每次后端连接被使用完毕之后就会被移除target并释放回空闲连接池,但是在事务开启的状态下,在SQL执行完毕的时候connection会在target中长期储存,直到session发起commit或者是rollback。 3 | 4 | 综上我们可以看到,Dble中的普通分布式事务其实就是后端mysql事务的集合,并且这个事务是没有文件记录的,由于mysql的事务特性在事务发生的过程中若断开连接等同于放弃事务,所以可能出现在commit的过程中由于各种意外情况导致事务的部分提交,例如连接后端四个节点dn1,dn2,dn3,dn4在提交commit进行依次下发的时候dn1,dn2,dn3都提交成功,但是dn4由于网络意外提交失败,导致了预期执行的部分内容丢失,并且由于dn1,dn2.dn3已经提交成功无法进行数据回滚,只能进行人工的数据补偿。 5 | 6 | 其逻辑图如下: 7 | 8 | :![一般分布式事务图](pic/2.5.1.png) 9 | 10 | -------------------------------------------------------------------------------- /2.Function/2.5_distribute_transaction/2.5.6_XA_trans_residual_xid.md: -------------------------------------------------------------------------------- 1 | ### 2.5.6 检测疑似残留XA事务 2 | 3 | #### 2.5.6.1 介绍&背景 4 | ##### 一、介绍Xid 5 | Xid:一个发下至各个节点中的xa事务名称. 6 | Sharding用户登陆的前端连接在开启XA事务(set xa = on)下会分配到一个Xid_Session(简称); 7 | Xid_Session格式: `Dble_Server.{instanceName}.{xaIDInc}` 其中`instanceName`为dble的实例命名, `xaIDInc`全局自增id. 8 | 在路由准备下发至节点阶段中, 会在Xid_Session之后拼接具体`db`(物理库名)获取最终的Xid, 用来下发至各个节点; 9 | Xid格式: `Dble_Server.{instanceName}.{xaIDInc}.{db}` 10 | `xaIDInc`起始值的定义: 在dble启动时,xaIDInc起始值为1(默认情况); 但如果存在xaRecovery日志且其中有存留上次Xid记录场景下, xaIDInc初始值则为上次Xid中xaIDInc值+1. 11 | 注意:xaRecovery日志: {xaRecoveryLogBaseDir}/{XaRecoveryLogBaseName}.log, 默认为xalogs/xalog-1.log 12 | 13 | ##### 二、背景 14 | 节点层面存留dble生成的Xid; 在xaRecovery日志清理的情况下启动dble, 意味着xaIDInc从1开始增长; 当增长到残留Xid中xaIDInc时, 会出现'The XID alread exists'报错; 15 | 此功能无需额外配置,可以在dble启动阶段、运行阶段将疑似残留XA事务问题很好的暴露出来. 16 | 17 | #### 2.5.6.2 检测机制 18 | 检测对象:被Sharding表关联dbGroup中的主节点 19 | 疑似残留Xid的格式: 符合Xid_Session或者Xid的格式 20 | 疑似残留Xid的正则表达式: `Dble_Server.{instanceName}.(\d)(.[^\s]+)?` 21 | 疑似残留Xid的日志关键字: Suspected residual xa transaction..... 22 | 23 | ##### 一、启动阶段 24 | 只要满足疑似残留Xid的正则表达式, 则被视为疑似残留Xid, 直接启动失败; 25 | 26 | ##### 二、运行阶段 27 | 满足疑似残留Xid的正则表达式且节点中的xaIDInc小于dble内部(正在使用)xaIDInc, 则被视为疑似残留Xid. 28 | ###### 设置检测周期 29 | 默认每隔300s的定时检测任务,见bootstrap.cnf中`-DxaIdCheckPeriod=300` 30 | 管理端命令: 31 | ``` 32 | reload @@xaIdCheck.period=60; -- 表示开启(或者调整)以60s为周期的定时检测任务 33 | reload @@xaIdCheck.period=0; -- 值小于等于0时,表示关闭定时检测任务 34 | ``` 35 | 日志中关键字:Start XaIdCheckPeriod、Stop XaIdCheckPeriod 36 | 37 | #### 2.5.6.3 其他检测 38 | ##### 一、查看所有节点下的xa情况 39 | 管理端, 查询dble_xa_recover表查看所有存活的主节点下XA情况. 40 | 41 | ##### 二、查看dble中正在使用的Xid 42 | 管理端, 查询session_connections表(或show @@connection)的结果中xa_id字段, xa_id值为Xid_Session格式表示处于XA事务中. 43 | 44 | -------------------------------------------------------------------------------- /2.Function/2.5_distribute_transaction/pic/2.5.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/2.5_distribute_transaction/pic/2.5.1.png -------------------------------------------------------------------------------- /2.Function/2.5_distribute_transaction/pic/2.5.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/2.5_distribute_transaction/pic/2.5.2.png -------------------------------------------------------------------------------- /2.Function/2.5_distribute_transaction/pic/2.5.3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/2.5_distribute_transaction/pic/2.5.3.png -------------------------------------------------------------------------------- /2.Function/2.5_distribute_transaction/pic/2.5.4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/2.5_distribute_transaction/pic/2.5.4.png -------------------------------------------------------------------------------- /2.Function/2.5_distribute_transaction/pic/2.5.5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/2.5_distribute_transaction/pic/2.5.5.png -------------------------------------------------------------------------------- /2.Function/pic/2.10.3_consistency_check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.10.3_consistency_check.png -------------------------------------------------------------------------------- /2.Function/pic/2.14_er_table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.14_er_table.png -------------------------------------------------------------------------------- /2.Function/pic/2.14_er_table_split.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.14_er_table_split.png -------------------------------------------------------------------------------- /2.Function/pic/2.15_global_table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.15_global_table.png -------------------------------------------------------------------------------- /2.Function/pic/2.18_performan_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.18_performan_result.png -------------------------------------------------------------------------------- /2.Function/pic/2.18_performance_checkpoint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.18_performance_checkpoint.png -------------------------------------------------------------------------------- /2.Function/pic/2.18_show_thread_used_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.18_show_thread_used_result.png -------------------------------------------------------------------------------- /2.Function/pic/2.20_slow_log_checkpoint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.20_slow_log_checkpoint.png -------------------------------------------------------------------------------- /2.Function/pic/2.23_front_back_connection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.23_front_back_connection.png -------------------------------------------------------------------------------- /2.Function/pic/2.25_flow_control_load.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.25_flow_control_load.png -------------------------------------------------------------------------------- /2.Function/pic/2.25_flow_control_select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.25_flow_control_select.png -------------------------------------------------------------------------------- /2.Function/pic/2.31_ddl2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.31_ddl2.png -------------------------------------------------------------------------------- /2.Function/pic/2.3_localread.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.3_localread.png -------------------------------------------------------------------------------- /2.Function/pic/2.3_rwSplitMode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.3_rwSplitMode.png -------------------------------------------------------------------------------- /2.Function/pic/2.6_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.6_1.png -------------------------------------------------------------------------------- /2.Function/pic/2.6_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.6_2.png -------------------------------------------------------------------------------- /2.Function/pic/2.7_bufferpage_structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.7_bufferpage_structure.png -------------------------------------------------------------------------------- /2.Function/pic/2.7_bufferpool_structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.7_bufferpool_structure.png -------------------------------------------------------------------------------- /2.Function/pic/2.7_memory_structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.7_memory_structure.png -------------------------------------------------------------------------------- /2.Function/pic/2.8_binlog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.8_binlog.png -------------------------------------------------------------------------------- /2.Function/pic/2.8_ddl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.8_ddl.png -------------------------------------------------------------------------------- /2.Function/pic/2.8_init.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.8_init.png -------------------------------------------------------------------------------- /2.Function/pic/2.8_legend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.8_legend.png -------------------------------------------------------------------------------- /2.Function/pic/2.8_reload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.8_reload.png -------------------------------------------------------------------------------- /2.Function/pic/2.8_view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/2.Function/pic/2.8_view.png -------------------------------------------------------------------------------- /3.SQL_Syntax/3.0_overview.md: -------------------------------------------------------------------------------- 1 | # 3.语法兼容 2 | 3 | * [3.1 DDL](3.1_DDL.md) 4 | * [3.1.1 DDL&Table Syntax](3.1_DDL/3.1.1_DDL&Table_Syntax.md) 5 | * [3.1.2 DDL&View Syntax](3.1_DDL/3.1.2_DDL&View_Syntax.md) 6 | * [3.1.3 DDL&Index Syntax](3.1_DDL/3.1.3_DDL&Index_Syntax.md) 7 | * [3.1.4 DDL透传](3.1_DDL/3.1.4_DDL_Penetrate.md) 8 | * [3.1.5 DDL&Database Syntax](3.1_DDL/3.1.5_DDL&Database_Syntax.md) 9 | * [3.1.6 ONLINE DDL](3.1_DDL/3.1.6_DDL&online_ddl.md) 10 | * [3.2 DML](3.2_DML.md) 11 | * [3.2.1 INSERT](3.2_DML/3.2.01_INSERT.md) 12 | * [3.2.2 REPLACE](3.2_DML/3.2.02_REPLACE.md) 13 | * [3.2.3 DELETE](3.2_DML/3.2.03_DELETE.md) 14 | * [3.2.4 UPDATE](3.2_DML/3.2.04_UPDATE.md) 15 | * [3.2.5 SELECT](3.2_DML/3.2.05_SELECT.md) 16 | * [3.2.6 SELECT JOIN syntax](3.2_DML/3.2.06_SELECT_JOIN_syntax.md) 17 | * [3.2.7 SELECT UNION Syntax](3.2_DML/3.2.07_UNION_Syntax.md) 18 | * [3.2.8 SELECT Subquery Syntax](3.2_DML/3.2.08_Subquery_Syntax.md) 19 | * [3.2.9 LOAD DATA](3.2_DML/3.2.09_LOAD_DATA.md) 20 | * [3.2.10 不支持的DML语句](3.2_DML/3.2.10_Unsupport_Syntax.md) 21 | * [3.3 Prepared SQL Syntax](3.3_Prepared_SQL_Syntax.md) 22 | * [3.4 Transactional and Locking Statements](3.4_Transactional_and_Locking_Statements.md) 23 | * [3.4.1 一般事务语法](3.4_Transactional_and_Locking_Statements/3.4.1_start_trans.md) 24 | * [3.4.2 含隐式提交语句](3.4_Transactional_and_Locking_Statements/3.4.2_Implicit_commit.md) 25 | * [3.4.3 SAVEPOINT语法](3.4_Transactional_and_Locking_Statements/3.4.3_savepoint_syntax.md) 26 | * [3.4.4 Lock&unlock语法](3.4_Transactional_and_Locking_Statements/3.4.4_Lock&unlock.md) 27 | * [3.4.5 SET TRANSACTION Syntax](3.4_Transactional_and_Locking_Statements/3.4.5_SET_TRANSACTION_Syntax.md) 28 | * [3.4.6 XA 事务语法](3.4_Transactional_and_Locking_Statements/3.4.6_XA_trans_syntax.md) 29 | * [3.4.7 其它不支持的事务语法](3.4_Transactional_and_Locking_Statements/3.4.7_other.md) 30 | * [3.5 DAL](3.5_DAL.md) 31 | * [3.5.1 SET](3.5_DAL/3.5.1_SET.md) 32 | * [3.5.2 SHOW](3.5_DAL/3.5.2_SHOW.md) 33 | * [3.5.3 KILL](3.5_DAL/3.5.3_KILL.md) 34 | * [3.5.4 不支持的DAL语句](3.5_DAL/3.5.4_Unsupport_Syntax.md) 35 | * [3.6 存储过程支持方式](3.6_procedure_support.md) 36 | * [3.7 Utility Statements](3.7_Utility_Statements.md) 37 | * [3.8 Hint](3.8_Hint.md) 38 | * [3.9 其他不支持语句](3.9_Other_unsupport.md) 39 | * [3.10 函数与操作符支持列表(alpha版本)](3.10_func_and_operators.md) 40 | * [3.11 导入导出方式](3.11_Export_and_Import.md) 41 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.11_Export_and_Import.md: -------------------------------------------------------------------------------- 1 | ## 3.11 导入导出方式的支持 2 | 3 | ### 3.11.1 支持工具 4 | 5 | 1. workbench 6 | 2. dbeaver 7 | 3. mysqldump 8 | 4. navicat 9 | 5. 导入数据也可以使用mysql中的source和load data 10 | 11 | ### 3.11.2 注意点 12 | 13 | 1. 若使用mysqldump导出时,请按照以下格式进行导出,否则可能出现错误,因为有些 mysqldump 参数dble不支持。 14 | 15 | ```shell 16 | ./mysqldump -h127.0.0.1 -utest -P3306 -p111111 --default-character-set=utf8mb4 --master-data=2 --single-transaction --set-gtid-purged=off --hex-blob --databases schema1 > export.sql 17 | ``` 18 | 19 | 2. 导入时,脚本中若存在非注释性的视图相关语句,需要注释掉或删除。 20 | 21 | 3. 导出时,因为dble对视图相关的一些语句不支持,因此尽量确保导出的dble中不存在视图。 -------------------------------------------------------------------------------- /3.SQL_Syntax/3.1_DDL.md: -------------------------------------------------------------------------------- 1 | ## 3.1 DDL 2 | DDL 包含以下几部分内容 3 | 4 | 注意,当DDL执行时,涉及到的相同的表上的DML和DDL操作将会报错。 5 | 6 | * [3.1.1 DDL&Table Syntax](3.1_DDL/3.1.1_DDL&Table_Syntax.md) 7 | * [3.1.2 DDL&View Syntax](3.1_DDL/3.1.2_DDL&View_Syntax.md) 8 | * [3.1.3 DDL&Index Syntax](3.1_DDL/3.1.3_DDL&Index_Syntax.md) 9 | * [3.1.4 DDL透传](3.1_DDL/3.1.4_DDL_Penetrate.md) 10 | 11 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.1_DDL/3.1.2_DDL&View_Syntax.md: -------------------------------------------------------------------------------- 1 | ### 3.1.2 VIEW DDL 2 | 3 | Syntax 4 | 5 | #### create view : 6 | 7 | ``` 8 | CREATE [OR REPLACE] VIEW 9 | 10 | view_name [(column_list)] 11 | 12 | AS select_statement 13 | ``` 14 | 15 | #### alter view : 16 | 17 | ``` 18 | alter VIEW 19 | 20 | view_name [(column_list)] 21 | 22 | AS select_statement 23 | ``` 24 | 25 | #### drop view: 26 | 27 | ``` 28 | DROP VIEW [IF EXISTS] view_name [, view_name] 29 | ``` 30 | 31 | #### show create view : 32 | 33 | ``` 34 | SHOW CREATE VIEW view_name; 35 | ``` 36 | 37 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.1_DDL/3.1.3_DDL&Index_Syntax.md: -------------------------------------------------------------------------------- 1 | ### 3.1.3 INDEX DDL 2 | 3 | #### 3.1.3.1 CREATE INDEX Syntax 4 | 5 | ``` 6 | CREATE [UNIQUE|FULLTEXT] INDEX index_name 7 | [index_type] 8 | ON tbl_name (index_col_name,...) 9 | 10 | index_col_name: 11 | col_name [(length)] [ASC | DESC] 12 | 13 | index_type: 14 | USING {BTREE | HASH} 15 | ``` 16 | 例: 17 | ``` 18 | create unique index idx1 using btree on test(col1); 19 | create index idx2 using hash on test(col2); 20 | create fulltext index idx3 on test(col4); 21 | create fulltext index idx4 on test(col4(10)); 22 | ``` 23 | 24 | #### 3.1.3.2 DROP INDEX Syntax 25 | 26 | ``` 27 | DROP INDEX index_name ON tbl_name 28 | ``` 29 | 例: 30 | ``` 31 | drop index idx1 on test; 32 | ``` 33 | 34 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.1_DDL/3.1.4_DDL_Penetrate.md: -------------------------------------------------------------------------------- 1 | ### 3.1.4 DDL透传 2 | 3 | 除了前面章节中的DDL语句,dble在非注解方式方式下不支持mysql中的其它DDL语句(eg. ALTER EVENT)。 4 | 但通过如下的注解方式,dble支持所有的mysql中的DDL语句: 5 | ``` 6 | /*!dble:sql=select ... from tbx where id=M*/ ddl statement; 7 | ``` 8 | 其中, tbx为分区表, id为分区列,M为分区列的某个值。 9 | 10 | 例如: 11 | ``` 12 | MySQL [TESTDB]> /*!dble:sql=select * from a_test where id=2*/CREATE PROCEDURE account_count() 13 | 14 | BEGIN SELECT 'Number of accounts:', COUNT(*) FROM mysql.user; 15 | 16 | END// 17 | ``` 18 | 19 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.1_DDL/3.1.5_DDL&Database_Syntax.md: -------------------------------------------------------------------------------- 1 | ### 3.1.5 DATABASE DDL 2 | 3 | #### 3.1.5.1 CREATE DATABASE Syntax 4 | ``` 5 | CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name 6 | [create_specification] ... 7 | 8 | create_specification: 9 | [DEFAULT] CHARACTER SET [=] charset_name 10 | | [DEFAULT] COLLATE [=] collation_name 11 | | DEFAULT ENCRYPTION [=] {'Y' | 'N'} 12 | ``` 13 | 14 | 注意: 15 | 16 | - schema一定要在shema.xml中配置 17 | - create_specification 中的选项不生效 18 | - 只具有语法意义,没有实际语义的作用,需要建库请用管理端口对应的命令 19 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.2_DML.md: -------------------------------------------------------------------------------- 1 | ## 3.2 DML 2 | DML 包含以下内容 3 | 4 | * [3.2.1 INSERT](3.2_DML/3.2.01_INSERT.md) 5 | * [3.2.2 REPLACE](3.2_DML/3.2.02_REPLACE.md) 6 | * [3.2.3 DELETE](3.2_DML/3.2.03_DELETE.md) 7 | * [3.2.4 UPDATE](3.2_DML/3.2.04_UPDATE.md) 8 | * [3.2.5 SELECT](3.2_DML/3.2.05_SELECT.md) 9 | * [3.2.6 SELECT JOIN syntax](3.2_DML/3.2.06_SELECT_JOIN_syntax.md) 10 | * [3.2.7 SELECT UNION Syntax](3.2_DML/3.2.07_UNION_Syntax.md) 11 | * [3.2.8 SELECT Subquery Syntax](3.2_DML/3.2.08_Subquery_Syntax.md) 12 | * [3.2.9 LOAD DATA](3.2_DML/3.2.09_LOAD_DATA.md) 13 | * [3.2.10 不支持的DML语句](3.2_DML/3.2.10_Unsupport_Syntax.md) 14 | 15 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.2_DML/3.2.02_REPLACE.md: -------------------------------------------------------------------------------- 1 | ### 3.2.2 REPLACE 2 | 3 | #### 3.2.2.1 Syntax 4 | 5 | 正常情况下,REPLACE只支持下面2种写法。 6 | 7 | ```SQL 8 | REPLACE 9 | [INTO] tbl_name 10 | [(col_name [, col_name] ...)] 11 | {VALUES | VALUE} (value_list) [, (value_list)] ... 12 | 13 | REPLACE 14 | [INTO] tbl_name 15 | SET assignment_list 16 | 17 | value: 18 | {expr | DEFAULT} 19 | 20 | value_list: 21 | value [, value] ... 22 | 23 | 24 | assignment: 25 | col_name = value 26 | 27 | assignment_list: 28 | assignment [, assignment] ... 29 | ``` 30 | 31 | 特殊情况下,支持下面这种写法。特殊场景参看下文细节 32 | ```SQL 33 | REPLACE 34 | [INTO] tbl_name 35 | [(col_name [, col_name] ...)] 36 | {SELECT ... | TABLE table_name} 37 | 38 | ``` 39 | 40 | #### 3.2.1.2 与MySQL语法区别 41 | 下文中红色表示不支持的语法或关键字 42 | 43 | ```diff 44 | REPLACE 45 | - [LOW_PRIORITY | DELAYED] 46 | [INTO] tbl_name 47 | - [PARTITION (partition_name [, partition_name] ...)] 48 | [(col_name [, col_name] ...)] 49 | - { 50 | {VALUES | VALUE} (value_list) [, (value_list)] ... 51 | - |VALUES row_constructor_list 52 | - } 53 | 54 | REPLACE 55 | - [LOW_PRIORITY | DELAYED] 56 | [INTO] tbl_name 57 | - [PARTITION (partition_name [, partition_name] ...)] 58 | SET assignment_list 59 | 60 | REPLACE 61 | - [LOW_PRIORITY | DELAYED] 62 | [INTO] tbl_name 63 | - [PARTITION (partition_name [, partition_name] ...)] 64 | [(col_name [, col_name] ...)] 65 | {SELECT ... | TABLE table_name} 66 | 67 | value: 68 | {expr | DEFAULT} 69 | 70 | value_list: 71 | value [, value] ... 72 | 73 | -row_constructor_list: 74 | - ROW(value_list)[, ROW(value_list)][, ...] 75 | 76 | assignment: 77 | col_name = value 78 | 79 | assignment_list: 80 | assignment [, assignment] ... 81 | ``` 82 | 83 | 84 | 85 | #### 3.2.2.3 举例 86 | 87 | ``` 88 | REPLACE INTO test VALUES (1, 'Old', '2014-08-20 18:47:00'); 89 | REPLACE INTO test set id = 1, type= 'Old',create_date = '2014-08-20 18:47:00'; 90 | ``` 91 | 92 | #### 3.2.2.4 限制 93 | * 由于replace的语义为如果存在则替换,如果不存在则新增,所以在使用表格自增主键的时候,如果对于自增表格使用replace且ID不存在,那么就会插入一条指定ID的数据,并不会自动生成ID 94 | * 存在特例,当`insert/replace... select `语句满足以下条件时,dble会在确保数据安全性的情况下对于SQL进行下发执行 95 | + 当插入目标是单节点表时,要求所有数据来源的表格都有明确的路由信息路由到同一节点 96 | + 当插入目标是全局表时,要求所有的数据来源表格都是全局表,并且路由范围能够覆盖插入目标 97 | + 当插入目标是分片表时,要求分片列的数据直接来源自拥有同样分片逻辑的分片表,并且对于select子查询中间的其他表格,要求能够子查询部分路由结果能整体下发,并且逻辑上无错误 98 | 99 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.2_DML/3.2.03_DELETE.md: -------------------------------------------------------------------------------- 1 | ### 3.2.3 DELETE 2 | 3 | #### 3.2.3.1 Single-Table Syntax 4 | ##### 3.2.3.1.1 Syntax 5 | 6 | ```SQL 7 | DELETE 8 | FROM tbl_name [[AS] tbl_alias] 9 | [WHERE where_condition] 10 | ``` 11 | 12 | 13 | ##### 3.2.3.1.2 与MySQL语法区别 14 | 下文中红色表示不支持的语法或关键字 15 | ```diff 16 | DELETE 17 | - [LOW_PRIORITY] [QUICK] [IGNORE] 18 | FROM tbl_name [[AS] tbl_alias] 19 | - [PARTITION (partition_name [, partition_name] ...)] 20 | [WHERE where_condition] 21 | - [ORDER BY ...] 22 | - [LIMIT row_count] 23 | ``` 24 | 25 | ##### 3.2.3.1.3 举例 26 | 27 | ``` 28 | delete from test where id>5; 29 | ``` 30 | 31 | ##### 3.2.3.1.4 限制 32 | 33 | * 原则上Delete语句中的where_condition部分只允许出现简单的条件,不能支持计算表达式以及子查询 34 | 35 | 36 | #### 3.2.3.2 Multiple-Table Syntax 37 | * 原则上不支持多表Join 的DELETE 38 | * 存在特例,当DELETE满足以下判断条件时,部分复杂DELETE语句会在确保数据正确的情况下被下发执行 39 | + 包括update/delete语句操作多表的时候,【操作的全是全局表,并拥有同样的分片范围,并且where条件中不含有子查询】或【所有操作的表都有条件显式路由到同一个节点,并且where条件不含有子查询】 40 | + 包括update/delete语句操作单表,但是where条件中包含子查询时,【被操作的表格是单节点表,where条件中的所有表格都有条件能路由到同一个节点】或【被操作的表格是全局表或者分片表,其余所有表格都是全局表,并且分片范围都能覆盖被操作的表格(需注意“分片范围”指的是 配置文件里面配的表分片范围,而不是经过 where 二次筛选后的范围。)】 41 | ##### 3.2.3.2.1 Syntax 42 | 43 | ```SQL 44 | DELETE 45 | tbl_name[.*] [, tbl_name[.*]] ... 46 | FROM table_references 47 | [WHERE where_condition] 48 | 49 | DELETE 50 | FROM tbl_name[.*] [, tbl_name[.*]] ... 51 | USING table_references 52 | [WHERE where_condition] 53 | ``` 54 | 55 | ##### 3.2.3.2.2 与MySQL语法区别 56 | 下文中红色表示不支持的语法或关键字 57 | ```diff 58 | DELETE 59 | - [LOW_PRIORITY] [QUICK] [IGNORE] 60 | tbl_name[.*] [, tbl_name[.*]] ... 61 | FROM table_references 62 | [WHERE where_condition] 63 | 64 | DELETE 65 | - [LOW_PRIORITY] [QUICK] [IGNORE] 66 | FROM tbl_name[.*] [, tbl_name[.*]] ... 67 | USING table_references 68 | [WHERE where_condition] 69 | ``` 70 | 71 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.2_DML/3.2.04_UPDATE.md: -------------------------------------------------------------------------------- 1 | ### 3.2.4 UPDATE 2 | #### 3.2.4.1 Single-Table Syntax 3 | ##### 3.2.4.1.1 Syntax 4 | 5 | ```SQL 6 | UPDATE 7 | table_reference 8 | SET assignment_list 9 | [WHERE where_condition] 10 | 11 | value: 12 | {expr | DEFAULT} 13 | 14 | assignment: 15 | col_name = value 16 | 17 | assignment_list: 18 | assignment [, assignment] ... 19 | ``` 20 | 21 | 22 | ##### 3.2.4.1.2 与MySQL语法区别 23 | 下文中红色表示不支持的语法或关键字 24 | ```diff 25 | UPDATE 26 | - [LOW_PRIORITY] [IGNORE] 27 | table_reference 28 | SET assignment_list 29 | [WHERE where_condition] 30 | - [ORDER BY ...] 31 | - [LIMIT row_count] 32 | 33 | value: 34 | {expr | DEFAULT} 35 | 36 | assignment: 37 | col_name = value 38 | 39 | assignment_list: 40 | assignment [, assignment] ... 41 | ``` 42 | 43 | ##### 3.2.4.1.3 举例 44 | 45 | ``` 46 | UPDATE test SET VALUE =1 where id=5; 47 | ``` 48 | 49 | ##### 3.2.4.1.4 限制 50 | 51 | * 原则上UPDATE语句中的where_condition部分只允许出现简单的条件,不能支持计算表达式以及子查询 52 | 53 | 54 | #### 3.2.4.2 Multiple-Table Syntax 55 | * 原则上不支持多表Join 的UPDATE 56 | * 存在特例,当update满足以下判断条件时,部分复杂UPDATE语句会在确保数据正确的情况下被下发执行 57 | + 包括update语句操作多表的时候,【操作的全是全局表,并拥有同样的分片范围,并且where条件中不含有子查询】或 58 | 【所有操作的表都有条件显式路由到同一个节点,并且where条件不含有子查询】 59 | + 包括update语句操作单表,但是where条件中包含子查询时,【被操作的表格是单节点表,where条件中的所有表格都有条件能路由到同一个节点】或【被操作的表格是全局表或者分片表,其余所有表格都是全局表,并且分片范围都能覆盖被操作的表格(需注意“分片范围”指的是 配置文件里面配的表分片范围,而不是经过 where 二次筛选后的范围。)】 60 | 61 | * 支持多表情况下的整体下发:where条件包含所有表的分片字段,并且存在ER关系,此时SQL是可以整体下发到多个节点 62 | * 支持部分场景下的update多表: 63 | + 目前只支持两张表的update,一张表为更新的表,另一张表为查询的表,查询的表支持子查询的形式 64 | + 支持更改同一张表的多个字段,不支持更改多个表的字段 65 | + set、where不包含子查询、表达式 66 | 67 | ##### 3.2.4.2.1 Syntax 68 | 69 | ```SQL 70 | UPDATE 71 | table_references 72 | SET assignment_list 73 | [WHERE where_condition] 74 | ``` 75 | 76 | ##### 3.2.4.2.2 与MySQL语法区别 77 | 下文中红色表示不支持的语法或关键字 78 | ```diff 79 | UPDATE 80 | - [LOW_PRIORITY] [IGNORE] 81 | table_references 82 | SET assignment_list 83 | [WHERE where_condition] 84 | ``` 85 | 86 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.2_DML/3.2.05_SELECT.md: -------------------------------------------------------------------------------- 1 | ### 3.2.5 SELECT 2 | 3 | #### 3.2.5.1 Syntax 4 | 5 | ```SQL 6 | 7 | SELECT 8 | [ALL | DISTINCT | DISTINCTROW ] 9 | select_expr [, select_expr] ... 10 | [FROM table_references] 11 | [WHERE where_condition] 12 | [GROUP BY {col_name | expr }, ... ] 13 | [HAVING where_condition] 14 | [ORDER BY {col_name | expr } 15 | [ASC | DESC], ... ] 16 | [LIMIT {[offset,] row_count | row_count OFFSET offset}] 17 | [FOR {UPDATE | SHARE} 18 | [NOWAIT | SKIP LOCKED] 19 | | LOCK IN SHARE MODE] 20 | ``` 21 | 22 | #### 3.2.5.2 与MySQL语法区别 23 | 24 | 下文中红色表示不支持的语法或关键字 25 | 26 | ```diff 27 | SELECT 28 | [ALL | DISTINCT | DISTINCTROW ] 29 | - [HIGH_PRIORITY] 30 | - [STRAIGHT_JOIN] 31 | - [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] 32 | - [SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] 33 | select_expr [, select_expr] ... 34 | - [into_option] 35 | [FROM table_references 36 | - [PARTITION partition_list] 37 | ] 38 | [WHERE where_condition] 39 | [GROUP BY {col_name | expr 40 | - | position 41 | }, ... 42 | - [WITH ROLLUP] 43 | ] 44 | [HAVING where_condition] 45 | - [WINDOW window_name AS (window_spec) 46 | - [, window_name AS (window_spec)] ...] 47 | [ORDER BY {col_name | expr 48 | - | position 49 | } [ASC | DESC], ... 50 | - [WITH ROLLUP] 51 | ] 52 | [LIMIT {[offset,] row_count | row_count OFFSET offset}] 53 | - [into_option] 54 | [FOR {UPDATE | SHARE} 55 | - [OF tbl_name [, tbl_name] ...] 56 | [NOWAIT | SKIP LOCKED] 57 | | LOCK IN SHARE MODE] 58 | - [into_option] 59 | 60 | -into_option: { 61 | - INTO OUTFILE 'file_name' 62 | - [CHARACTER SET charset_name] 63 | - export_options 64 | - | INTO DUMPFILE 'file_name' 65 | - | INTO var_name [, var_name] ... 66 | -} 67 | ``` 68 | 69 | #### 3.2.5.3 举例 70 | 71 | ``` 72 | select id,col1,col3 from test where id=3; 73 | select distinct col1,col3 from test where id>=3; 74 | select count(*),max(id),col1 from test group by col1 desc having(count(*)>1) order by col1 desc; 75 | select id,col1,col3 from test order by id limit 2 offset 2; 76 | select id,col1,col3 from test order by id limit 2,2; 77 | select 1+1,'test',id,col1*1.1,now() from test limit 3; 78 | select current_date,current_timestamp; 79 | select * from test where id=3 for update skip locked; 80 | select * from test where id=3 for share; 81 | select * from test where id=3 LOCK IN SHARE MODE; 82 | ``` 83 | 84 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.2_DML/3.2.06_SELECT_JOIN_syntax.md: -------------------------------------------------------------------------------- 1 | ### 3.2.6 JOIN Syntax: 2 | 本节主要描述 `SELECT` 语句和多表的`DELETE` 以及 `UPDATE`语句中的`table_references `部分里面的`JOIN` 语法 3 | #### 3.2.6.1 Syntax 4 | 5 | ```SQL 6 | 7 | table_references: 8 | table_reference [, table_reference] ... 9 | 10 | 11 | table_reference: { 12 | table_factor 13 | | joined_table 14 | } 15 | 16 | table_factor: { 17 | tbl_name [[AS] alias] 18 | | table_subquery [AS] alias 19 | | ( table_references ) 20 | } 21 | 22 | joined_table: { 23 | table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification] 24 | | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification 25 | | table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor 26 | } 27 | 28 | join_specification: { 29 | ON search_condition 30 | | USING (join_column_list) 31 | } 32 | 33 | join_column_list: 34 | column_name [, column_name] ... 35 | ``` 36 | 37 | 注意:这里table_subquery的问题,会在后续章节单独展开讨论 38 | 39 | #### 3.2.6.2 与MySQL语法区别 40 | 下文中红色表示不支持的语法或关键字 41 | 42 | 43 | ```diff 44 | 45 | table_references: 46 | escaped_table_reference [, escaped_table_reference] ... 47 | 48 | escaped_table_reference: { 49 | table_reference 50 | - | { OJ table_reference } 51 | } 52 | 53 | table_reference: { 54 | table_factor 55 | | joined_table 56 | } 57 | 58 | table_factor: { 59 | tbl_name 60 | - [PARTITION (partition_names)] 61 | [[AS] alias] 62 | - [index_hint_list] 63 | | 64 | - [LATERAL] 65 | table_subquery [AS] alias 66 | - [(col_list)] 67 | | ( table_references ) 68 | } 69 | 70 | joined_table: { 71 | table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification] 72 | | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification 73 | | table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor 74 | } 75 | 76 | join_specification: { 77 | ON search_condition 78 | | USING (join_column_list) 79 | } 80 | 81 | join_column_list: 82 | column_name [, column_name] ... 83 | 84 | -index_hint_list: 85 | - index_hint [, index_hint] ... 86 | 87 | -index_hint: { 88 | - USE {INDEX|KEY} 89 | - [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list]) 90 | - | {IGNORE|FORCE} {INDEX|KEY} 91 | - [FOR {JOIN|ORDER BY|GROUP BY}] (index_list) 92 | -} 93 | 94 | -index_list: 95 | - index_name [, index_name] ... 96 | 97 | ``` -------------------------------------------------------------------------------- /3.SQL_Syntax/3.2_DML/3.2.07_UNION_Syntax.md: -------------------------------------------------------------------------------- 1 | ### 3.2.7 UNION Syntax: 2 | 与MYSQL语法完全兼容 3 | 4 | ```SQL 5 | 6 | query_block UNION [ALL | DISTINCT] query_block 7 | [UNION [ALL | DISTINCT] query_block] 8 | [...] 9 | 10 | ``` 11 | 12 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.2_DML/3.2.08_Subquery_Syntax.md: -------------------------------------------------------------------------------- 1 | ### 3.2.8 Subquery 2 | 3 | #### 3.2.8.1 The Subquery as Scalar Operand 4 | 支持标量子查询 5 | 6 | For example : 7 | ```SQL 8 | SELECT (SELECT s2 FROM t1); 9 | SELECT (SELECT s1 FROM t2) FROM t1; 10 | SELECT UPPER((SELECT s1 FROM t1)) FROM t2; 11 | ``` 12 | 13 | 14 | #### 3.2.8.2 Comparisons Using Subqueries 15 | 支持子查询用于比较 16 | 17 | 子查询最常用的形式是: 18 | ```SQL 19 | non_subquery_operand comparison_operator (subquery) 20 | ``` 21 | 其中 comparison_operator 是这些运算符之一: 22 | ```SQL 23 | = > < >= <= <> != <=> 24 | ``` 25 | MySQL 也允许这种结构: 26 | ``` 27 | non_subquery_operand LIKE (subquery) 28 | ``` 29 | #### 3.2.8.3 Subqueries with ANY, IN, or SOME 30 | 支持此类子查询 31 | Syntax: 32 | ```SQL 33 | operand comparison_operator ANY (subquery) 34 | operand IN (subquery) 35 | operand comparison_operator SOME (subquery) 36 | ``` 37 | 38 | 其中 comparison_operator 是这些运算符之一: 39 | 40 | ```SQL 41 | 42 | = > < >= <= <> != 43 | ``` 44 | 45 | #### 3.2.8.4 Subqueries with ALL 46 | 支持此类子查询 47 | Syntax: 48 | ```SQL 49 | operand comparison_operator ALL (subquery) 50 | ``` 51 | 52 | #### 3.2.8.5 Subqueries with EXISTS or NOT EXISTS 53 | 支持此类子查询 54 | 55 | For example: 56 | ```SQL 57 | SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2); 58 | ``` 59 | 60 | 61 | 62 | #### 3.2.8.6 Derived Tables (Subqueries in the FROM Clause) 63 | 部分支持此类子查询 64 | 65 | For example: 66 | ```SQL 67 | SELECT ... FROM (subquery) [AS] tbl_name ... 68 | ``` 69 | 不支持下面的形式: 70 | 71 | ```SQL 72 | SELECT * FROM JSON_TABLE(arg_list) [AS] tbl_name ... 73 | SELECT ... FROM (subquery) [AS] tbl_name (col_list) ... 74 | ``` 75 | #### 3.2.8.7 Row Subqueries 76 | 不支持[行子查询](https://dev.mysql.com/doc/refman/8.0/en/row-subqueries.html) 77 | 78 | #### 3.2.8.8 Correlated Subqueries 79 | 不支持[相关子查询](https://dev.mysql.com/doc/refman/8.0/en/correlated-subqueries.html)和相关子查询与其他子查询混合的方式 80 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.2_DML/3.2.09_LOAD_DATA.md: -------------------------------------------------------------------------------- 1 | ### 3.2.9 LOAD DATA 2 | 3 | #### 3.2.9.1 Syntax 4 | ```SQL 5 | LOAD DATA 6 | [LOCAL] 7 | INFILE 'file_name' 8 | [REPLACE | IGNORE] 9 | INTO TABLE tbl_name 10 | CHARACTER SET 'charset_name' 11 | [{FIELDS | COLUMNS} 12 | [TERMINATED BY 'string'] 13 | [[OPTIONALLY] ENCLOSED BY 'char'] 14 | [ESCAPED BY 'char'] 15 | ] 16 | [LINES 17 | [STARTING BY 'string'] 18 | [TERMINATED BY 'string'] 19 | ] 20 | [IGNORE number {LINES }] 21 | [(col_name_or_user_var 22 | [, col_name_or_user_var] ...)] 23 | [SET col_name={expr | DEFAULT} 24 | [, col_name={expr | DEFAULT}] ...] 25 | 26 | ``` 27 | #### 3.2.9.2 与MySQL语法区别 28 | 29 | 下文中红色表示不支持的语法或关键字,红绿两色表示稍微不相同的地方 30 | 31 | ```diff 32 | LOAD DATA 33 | - [LOW_PRIORITY | CONCURRENT] 34 | [LOCAL] 35 | INFILE 'file_name' 36 | [REPLACE | IGNORE] 37 | INTO TABLE tbl_name 38 | - [PARTITION (partition_name [, partition_name] ...)] 39 | - [CHARACTER SET charset_name] 40 | + CHARACTER SET 'charset_name' 41 | [{FIELDS | COLUMNS} 42 | [TERMINATED BY 'string'] 43 | [[OPTIONALLY] ENCLOSED BY 'char'] 44 | [ESCAPED BY 'char'] 45 | ] 46 | [LINES 47 | [STARTING BY 'string'] 48 | [TERMINATED BY 'string'] 49 | ] 50 | [IGNORE number { 51 | LINES 52 | - | ROWS 53 | }] 54 | [(col_name_or_user_var 55 | [, col_name_or_user_var] ...)] 56 | [SET col_name={expr | DEFAULT} 57 | [, col_name={expr | DEFAULT}] ...] 58 | ``` 59 | 60 | #### 3.2.9.3 举例 61 | 62 | ``` 63 | load data infile 'data.txt' into table test_table CHARACTER SET 'utf8mb4' FIELDS TERMINATED by ','; 64 | ``` 65 | 66 | #### 3.2.9.4 原理 67 | 68 | dble解析MySQL协议之后,会根据数据路由拆分文件,每满足maxRowSizeToFile(可通过bootstrap.cnf配置)就写到文件中,再通过 load data local infile 的方式导入到后端结点。 69 | 所以,这里[local_infile](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_local_infile)这个参数会影响到load data的正确性. 70 | 可参考[#1085](https://github.com/actiontech/dble/issues/1085) 71 | 72 | 73 | #### 3.2.9.5 限制 74 | 75 | * 存在BUG导致在dble中CHARACTER SET charset_name必填 76 | * 由于 dble 依赖的 druid 解析器的限制,charset_name必须单引号包括。比如 CHARACTER SET 'utf8mb4' ,不可使用CHARACTER SET "utf8mb4" 或者 CHARACTER SET utf8mb4 77 | * 在mysql中如果插入的数据不符合规范会插入部分数据,相对来说dble的load data对正确性有更高的要求,一个错误的发生会导致整体操作的回滚 78 | * 在ENCLOSED BY的时候存在BUG,使用的的时候会导致转义的数据无法被正确转义存储到数据库中 79 | * 由于当前解析设定的限制,loaddata默认每列最大字节数65535,可通过bootstrap.cnf中的maxCharsPerColumn配置修改 80 | * 使用load data导入数据时,若导入表是分片表,应保证导入文件中分片键数据符合分片规则的要求,否则dble将会报错.详细参考issue:https://github.com/actiontech/dble/issues/770 81 | * load data语句需要严格按照语法书写,由于druid解析器的缘故,若语法或关键字错误,druid会解析出错误的语句,从而导致结果错误.详细请参照issue:https://github.com/actiontech/dble/issues/1248 82 | * load data语句读字段的时候,如果遇到行结束符,会认为是本行结束了,需要注意:https://github.com/actiontech/dble/issues/1507 83 | * load data中使用用户变量后,再次查询用户变量的值是不正确的,可参考issue:https://github.com/actiontech/dble/issues/1761 84 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.2_DML/3.2.10_Unsupport_Syntax.md: -------------------------------------------------------------------------------- 1 | ### 3.2.10 不支持的DML语句 2 | 3 | #### 3.2.10.1 以下语句不支持,点击链接会跳转到MySQL官方文档 4 | 5 | [DO Statement](https://dev.mysql.com/doc/refman/8.0/en/do.html) 6 | [EXCEPT Clause](https://dev.mysql.com/doc/refman/8.0/en/except.html) 7 | [HANDLER Statement](https://dev.mysql.com/doc/refman/8.0/en/handler.html) 8 | [IMPORT TABLE Statement](https://dev.mysql.com/doc/refman/8.0/en/import-table.html) 9 | [INTERSECT Clause](https://dev.mysql.com/doc/refman/8.0/en/intersect.html) 10 | [LOAD XML Statement](https://dev.mysql.com/doc/refman/8.0/en/load-xml.html) 11 | [Parenthesized Query Expressions](https://dev.mysql.com/doc/refman/8.0/en/parenthesized-query-expressions.html) 12 | [TABLE Statement](https://dev.mysql.com/doc/refman/8.0/en/table.html) 13 | [VALUES Statement](https://dev.mysql.com/doc/refman/8.0/en/values.html) 14 | [WITH (Common Table Expressions)](https://dev.mysql.com/doc/refman/8.0/en/with.html) 15 | 16 | 17 | 18 | #### 3.2.10.2 部分支持的语句 19 | 1. [Set Operations with UNION, INTERSECT, and EXCEPT](https://dev.mysql.com/doc/refman/8.0/en/set-operations.html) 20 | 目前dble只支持UNION 21 | 22 | 23 | 2. [CALL Statement](https://dev.mysql.com/doc/refman/8.0/en/call.html) 24 | 25 | 存储过程支持方式参见[3.6_procedure_support](3.SQL_Syntax/3.6_procedure_support.md) -------------------------------------------------------------------------------- /3.SQL_Syntax/3.3_Prepared_SQL_Syntax.md: -------------------------------------------------------------------------------- 1 | ## 3.3 Prepared Statements 2 | 3 | ### 3.3.1 PREPARE Statement 4 | 完全兼容MySQL 5 | 6 | ```SQL 7 | PREPARE stmt_name FROM preparable_stmt 8 | ``` 9 | 例: 10 | ``` 11 | prepare stmt1 from "select * from a_test where id=?"; 12 | ``` 13 | 14 | ### 3.3.2 EXECUTE Statement 15 | 完全兼容MySQL 16 | 17 | ```SQL 18 | EXECUTE stmt_name 19 | [USING @var_name [, @var_name] ...] 20 | ``` 21 | 例: 22 | ``` 23 | SET @a = 1; 24 | EXECUTE stmt1 USING @a; 25 | ``` 26 | 27 | ### 3.3.3 DEALLOCATE PREPARE Statement 28 | 完全兼容MySQL 29 | 30 | 31 | ```SQL 32 | {DEALLOCATE | DROP} PREPARE stmt_name 33 | ``` 34 | 例: 35 | ``` 36 | DROP PREPARE stmt1; 37 | ``` 38 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.4_Transactional_and_Locking_Statements.md: -------------------------------------------------------------------------------- 1 | ## 3.4 Transactional and Locking Statements 2 | Transactional and Locking Statements 包含以下内容 3 | 4 | * [3.4.1 一般事务语法](3.4_Transactional_and_Locking_Statements/3.4.1_start_trans.md) 5 | * [3.4.2 含隐式提交语句](3.4_Transactional_and_Locking_Statements/3.4.2_Implicit_commit.md) 6 | * [3.4.3 SAVEPOINT语法](3.4_Transactional_and_Locking_Statements/3.4.3_savepoint_syntax.md) 7 | * [3.4.4 Lock&unlock语法](3.4_Transactional_and_Locking_Statements/3.4.4_Lock&unlock.md) 8 | * [3.4.5 SET TRANSACTION Syntax](3.4_Transactional_and_Locking_Statements/3.4.5_SET_TRANSACTION_Syntax.md) 9 | * [3.4.6 XA 事务语法](3.4_Transactional_and_Locking_Statements/3.4.6_XA_trans_syntax.md) 10 | * [3.4.7 其它不支持的事务语法](3.4_Transactional_and_Locking_Statements/3.4.7_other.md) 11 | 12 | 13 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.4_Transactional_and_Locking_Statements/3.4.1_start_trans.md: -------------------------------------------------------------------------------- 1 | ### 3.4.1 START TRANSACTION, COMMIT, and ROLLBACK Statements 2 | 3 | #### 3.4.1.1 Syntax 4 | ##### 开启事务 5 | 6 | ```SQL 7 | START TRANSACTION 8 | 9 | BEGIN 10 | 11 | SET autocommit = {0 | 1} 12 | ``` 13 | 14 | ##### 提交事务 15 | ```SQL 16 | COMMIT 17 | ``` 18 | ##### 回滚事务 19 | ```SQL 20 | ROLLBACK 21 | ``` 22 | 23 | #### 3.4.1.2 与MySQL语法区别 24 | 25 | 下文中红色表示不支持的语法或关键字 26 | 27 | ```diff 28 | START TRANSACTION 29 | - [transaction_characteristic [, transaction_characteristic] ...] 30 | 31 | -transaction_characteristic: { 32 | - WITH CONSISTENT SNAPSHOT 33 | - | READ WRITE 34 | - | READ ONLY 35 | -} 36 | 37 | BEGIN 38 | -[WORK] 39 | 40 | COMMIT 41 | -[WORK] [AND [NO] CHAIN] [[NO] RELEASE] 42 | 43 | ROLLBACK 44 | -[WORK] [AND [NO] CHAIN] [[NO] RELEASE] 45 | 46 | SET autocommit = {0 | 1} 47 | 48 | ``` 49 | 50 | #### 3.4.1.3 限制 51 | 52 | * 2PC实现的分布式事务(非xa方式)可能会出现commit时部分提交的情况,如需保障最终一致性,需要开启XA 53 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.4_Transactional_and_Locking_Statements/3.4.2_Implicit_commit.md: -------------------------------------------------------------------------------- 1 | ## 3.4.2 Implicit commit SQL 2 | #### 3.4.2.1 含隐式提交语句 3 | 注意:执行含隐式提交语句出现1064,1046错误码,则隐式提交并不会实际生效. 4 | 5 | ##### 3.4.2.2 sharding用户中,隐式提交支持度比较有限,具体如下: 6 | * [3.1.1 DDL&Table Syntax](../3.1_DDL/3.1.1_DDL&Table_Syntax.md) 7 | * [3.1.2 DDL&View Syntax](../3.1_DDL/3.1.2_DDL&View_Syntax.md) 8 | * [3.1.3 DDL&Index Syntax](../3.1_DDL/3.1.3_DDL&Index_Syntax.md) 9 | * Lock tables... 10 | 11 | ##### 3.4.2.3 rwsplit用户中,隐式提交支持度几乎同mysql: [见详请](https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html) 12 | 13 | 14 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.4_Transactional_and_Locking_Statements/3.4.3_savepoint_syntax.md: -------------------------------------------------------------------------------- 1 | ### 3.4.3 SAVEPOINT, ROLLBACK TO SAVEPOINT, and RELEASE SAVEPOINT Syntax 2 | 3 | #### 3.4.3.1 Syntax 4 | 语法与MySQL完全相同 5 | 6 | 7 | ```sql 8 | SAVEPOINT identifier 9 | ROLLBACK [WORK] TO [SAVEPOINT] identifier 10 | RELEASE SAVEPOINT identifier 11 | 12 | ``` 13 | 14 | #### 3.4.2.2 与MySQL语法区别 15 | 16 | 下文中红色表示不支持的语法或关键字 17 | 18 | 19 | #### 3.4.3.2 举例 20 | 21 | ```sql 22 | # start transaction 23 | set autocommit = 0; 24 | 25 | # savepoint 26 | savepoint s0; 27 | insert into test value(1); 28 | savepoint s1; 29 | insert into test value(2); 30 | savepoint s2; 31 | insert into test value(3); 32 | 33 | # rollback to 34 | rollback to s0 35 | 36 | # release 37 | release savepoint s0 38 | ``` 39 | 40 | #### 3.4.3.3 限制 41 | 42 | 1. 在mysql中,在事务外也可以定义savepoint,但是这些savepoint是没有意义的.因此在dble中savepoint强制在事务中使用,否则报错. 43 | 2. ROLLBACK TO [SAVEPOINT] *identifier* 语句暂不支持 work 可选项. 44 | 45 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.4_Transactional_and_Locking_Statements/3.4.4_Lock&unlock.md: -------------------------------------------------------------------------------- 1 | ### 3.4.4 Lock&unlock 2 | 3 | #### 3.4.4.1 Syntax 4 | ```SQL 5 | LOCK TABLES 6 | tbl_name [[AS] alias] lock_type 7 | 8 | lock_type: { 9 | READ | WRITE 10 | } 11 | 12 | UNLOCK TABLES 13 | ``` 14 | 15 | #### 3.4.4.2 与MySQL语法区别 16 | 17 | 下文中红色表示不支持的语法或关键字 18 | 19 | ```diff 20 | LOCK TABLES 21 | tbl_name [[AS] alias] lock_type 22 | - [, tbl_name [[AS] alias] lock_type] ... 23 | 24 | lock_type: { 25 | READ 26 | - [LOCAL] 27 | | 28 | - [LOW_PRIORITY] 29 | WRITE 30 | } 31 | 32 | UNLOCK TABLES 33 | ``` 34 | #### 3.4.4.3 举例 35 | 36 | ``` 37 | lock tables test_table read; 38 | unlock tables; 39 | 40 | ``` 41 | 42 | #### 3.4.4.4 限制 43 | 44 | 1. 当前session加锁后访问其他表可能不会被阻止或者报错。 45 | 2. 加写锁后,复杂查询可能不会返回正确结果。 46 | 47 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.4_Transactional_and_Locking_Statements/3.4.5_SET_TRANSACTION_Syntax.md: -------------------------------------------------------------------------------- 1 | ### 3.4.5 SET TRANSACTION Syntax 2 | #### 3.4.5.1 Syntax 3 | 4 | 5 | ```SQL 6 | SET SESSION TRANSACTION ISOLATION LEVEL level 7 | 8 | 9 | 10 | level: { 11 | REPEATABLE READ 12 | | READ COMMITTED 13 | | READ UNCOMMITTED 14 | | SERIALIZABLE 15 | } 16 | 17 | ``` 18 | 19 | 也支持 20 | ```SQL 21 | SET @@SESSION.TX_ISOLATION = 'level_str' 22 | 23 | level_str: 24 | REPEATABLE-READ 25 | | READ-COMMITTED 26 | | READ-UNCOMMITTED 27 | | SERIALIZABLE 28 | ``` 29 | 30 | #### 3.4.5.2 与MySQL语法区别 31 | 32 | 下文中红色表示不支持的语法或关键字 33 | 34 | ```diff 35 | SET 36 | - [GLOBAL | 37 | SESSION 38 | - ] 39 | TRANSACTION 40 | transaction_characteristic 41 | - [, transaction_characteristic] ... 42 | 43 | transaction_characteristic: { 44 | ISOLATION LEVEL level 45 | - | access_mode 46 | } 47 | 48 | level: { 49 | REPEATABLE READ 50 | | READ COMMITTED 51 | | READ UNCOMMITTED 52 | | SERIALIZABLE 53 | } 54 | 55 | -access_mode: { 56 | - READ WRITE 57 | - | READ ONLY 58 | -} 59 | ``` 60 | 注:因为隔离级别不加session关键字语义不同,作用域为下一个语句,目前暂不支持不加session 61 | 62 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.4_Transactional_and_Locking_Statements/3.4.6_XA_trans_syntax.md: -------------------------------------------------------------------------------- 1 | ### 3.4.6 XA 事务语法 2 | dble不支持外部XA事务,以下讨论内容是对于后端结点之间使用xa事务的问题 3 | 4 | #### 3.4.6.1 Syntax 5 | 6 | ##### 开启XA 7 | ```SQL 8 | set xa = {0|1} 9 | ``` 10 | ##### 开启事务 11 | ```SQL 12 | START TRANSACTION; 13 | 14 | BEGIN 15 | 16 | SET autocommit = {0 | 1} 17 | ``` 18 | ##### 提交事务 19 | ```SQL 20 | COMMIT 21 | ``` 22 | ##### 回滚事务 23 | ```SQL 24 | ROLLBACK 25 | ``` 26 | #### 3.4.6.2 限制 27 | 28 | * xa事务中不支持含有隐式提交的sql 29 | 30 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.4_Transactional_and_Locking_Statements/3.4.7_other.md: -------------------------------------------------------------------------------- 1 | ### 3.4.7 其他不支持的事务语法 2 | 3 | [LOCK INSTANCE FOR BACKUP and UNLOCK INSTANCE Statements](https://dev.mysql.com/doc/refman/8.0/en/lock-instance-for-backup.html) 4 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.5_DAL.md: -------------------------------------------------------------------------------- 1 | ## 3.5 DAL 2 | DAL主要包含以下内容 3 | 4 | * [3.5.1 SET](3.5_DAL/3.5.1_SET.md) 5 | * [3.5.2 SHOW](3.5_DAL/3.5.2_SHOW.md) 6 | * [3.5.3 KILL](3.5_DAL/3.5.3_KILL.md) 7 | * [3.5.4 不支持的DAL语句](3.5_DAL/3.5.4_Unsupport_Syntax.md) 8 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.5_DAL/3.5.2_SHOW.md: -------------------------------------------------------------------------------- 1 | 2 | ### 3.5.2 SHOW语句 3 | 4 | #### 3.5.2.1 dble劫持的SHOW 5 | 6 | + SHOW DATABASES 7 | 将sharding.xml 中的所有schema展示出来 。 8 | + SHOW CREATE DATABASE [IF NOT EXISTS] schema 9 | 将sharding.xml 中的指定schema的创建语句展示,创建语句为dble伪造,无实际意义 。 10 | + SHOW [FULL|ALL] TABLES [FROM db_name] [LIKE 'pattern'| WHERE expr] 11 | 当schmea没有配置默认节点时,将schema下配置的tables直接展示出来。 12 | 当schema有默认节点时,将语句转发至默认节点,然后将结果集与schema下配置的tables做一个去重合并,再返回给客户端。 13 | + SHOW ALL TABLES [FROM db_name] [LIKE 'pattern'| WHERE expr] 14 | dble自有命令,与SHOW FULL TABLES 返回结果集类似,不同之处是Table\_type这列分为了 SHARDING TABLE,sharding table, GLOBAL TABLE 。参见[6.Differernce_from_MySQL_Server.md](../../6.Differernce_from_MySQL_Server/6.Differernce_from_MySQL_Server.md)。 15 | + SHOW [FULL] {COLUMNS | FIELDS} FROM tbl_name [{FROM|IN} db_name] [LIKE 'pattern' | WHERE expr] 16 | 将逻辑schema转为物理schema之后下发到表所在的任意节点。 17 | + SHOW { INDEX | INDEXES | KEYS} {FROM | IN} tbl_name [ {FROM | IN} db_name ] [ WHERE expr] 18 | 将逻辑schema转为物理schema之后下发到表所在的任意节点。 19 | + SHOW CREATE TABLE tbl_name 20 | 将逻辑schema转为物理schema之后下发到表所在的任意节点。 21 | + SHOW [GLOBAL | SESSION] VARIABLES [LIKE 'pattern' | WHERE expr] 22 | 随机转发到任意节点,收到结果集后,用本地变量进行覆盖(global 不正确?) 23 | + SHOW CREATE VIEW view_name 24 | 将dble层面的view展示出来 25 | + SHOW CHARSET 26 | 将之转为show character set 之后透传转发 27 | + SHOW TABLE STATUS [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr] 28 | 只是为了支持SQLyog,其中name列逻辑和show tables一致,其他列均为伪造。 29 | + SHOW TRACE 30 | 观察trace结果,详情请见 [单条SQL性能trace](../../2.Function/2.21_query_trace.md) 31 | 32 | 注意事项: 33 | 34 | 所有以上命令的explain结果可能不准确。 35 | 36 | 例: 37 | ``` 38 | show databases; 39 | show full tables; 40 | show columns from a_test; 41 | show index from a_test; 42 | show create table a_test; 43 | show variables; 44 | show charset; 45 | ``` 46 | 47 | #### 3.5.2.2 dble透传的SHOW 48 | 49 | 除了dble劫持的特定SHOW语句外,其它SHOW语句都透传,这些语句与MySQL语法相同。 50 | 51 | 例: 52 | ``` 53 | SHOW CHARACTER SET; 54 | SHOW CHARACTER SET like 'utf8'; 55 | SHOW CHARACTER SET where maxlen=2; 56 | ``` 57 | 58 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.5_DAL/3.5.3_KILL.md: -------------------------------------------------------------------------------- 1 | ### 3.5.3 KILL 2 | 完全支持MySQL语法: 3 | ```SQL 4 | KILL [CONNECTION | QUERY] processlist_id 5 | ``` 6 | #### 3.5.3.1 KILL [CONNECTION] conn_id 7 | 8 | 其中,conn_id为 前端连接id值,可以通过运维命令show @@connection 获取。 9 | 10 | ##### 3.5.3.1.1 举例 11 | 12 | ``` 13 | kill 1; 14 | ``` 15 | 16 | ##### 3.5.3.1.2 限制 17 | 18 | * 在Kill自身连接的时候只会向自身写入OK包,不会有其他操作 19 | * 如果Kill的连接在XA事务的提交或者回滚状态,不会直接关闭后端连接,会仅关闭前端连接 20 | * 后端连接的关闭通过向MYSQL节点发送 KILL processlist_id 来完成 21 | 22 | #### 3.5.3.2 KILL query conn_id 23 | 24 | 其中,conn_id为 前端连接id值,可以通过运维命令show @@connection 获取。 25 | 26 | ##### 3.5.3.2.1 举例 27 | 28 | ``` 29 | kill query 1; 30 | ``` 31 | 32 | ##### 3.5.3.2.3 说明 33 | 34 | * dble 中kill query的实现是将正在执行语句的后端连接与前端连接相割离的方式来实现。 35 | * 后端未执行完成的语句,取决与mysql自身的机制。 36 | 37 | ##### 3.5.3.2.2 限制 38 | 39 | * 对于ddl语句,不保证一致性 40 | * 对于未开启事务的dml操作不保证一致性 -------------------------------------------------------------------------------- /3.SQL_Syntax/3.5_DAL/3.5.4_Unsupport_Syntax.md: -------------------------------------------------------------------------------- 1 | ### 3.5.4 不支持的DAL语句 2 | 3 | #### 3.5.4 .1 以下语句不支持,点击链接会跳转到MySQL官方文档 4 | 5 | [Account Management Statements](https://dev.mysql.com/doc/refman/8.0/en/account-management-statements.html) 6 | [Resource Group Management Statements](https://dev.mysql.com/doc/refman/8.0/en/resource-group-statements.html) 7 | [Table Maintenance Statements](https://dev.mysql.com/doc/refman/8.0/en/table-maintenance-statements.html) 8 | [Component, Plugin, and Loadable Function Statements](https://dev.mysql.com/doc/refman/8.0/en/component-statements.html) 9 | [CLONE Statement](https://dev.mysql.com/doc/refman/8.0/en/clone.html) 10 | [BINLOG Statement](https://dev.mysql.com/doc/refman/8.0/en/binlog.html) 11 | [CACHE INDEX Statement](https://dev.mysql.com/doc/refman/8.0/en/cache-index.html) 12 | [FLUSH Statement]( https://dev.mysql.com/doc/refman/8.0/en/flush.html) 13 | [LOAD INDEX INTO CACHE Statement](https://dev.mysql.com/doc/refman/8.0/en/load-index.html) 14 | [RESET Statement]( https://dev.mysql.com/doc/refman/8.0/en/reset.html) 15 | [RESET PERSIST Statement]( https://dev.mysql.com/doc/refman/8.0/en/reset-persist.html) 16 | [RESTART Statement]( https://dev.mysql.com/doc/refman/8.0/en/restart.html) 17 | [SHUTDOWN Statement]( https://dev.mysql.com/doc/refman/8.0/en/shutdown.html) 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.7_Utility_Statements.md: -------------------------------------------------------------------------------- 1 | ## 3.7 Utility Statements 2 | 3 | ### 3.7.1 USE Statement 4 | 完全兼容MySQL语法 5 | 6 | ``` 7 | USE db_name 8 | ``` 9 | 例: 10 | ``` 11 | use TESTDB; 12 | ``` 13 | 14 | ### 3.7.2 EXPLAIN Statement 15 | EXPLAIN 在dble中只负责查询计划,查询计划用法见[2.17_explain](../2.Function/2.17_explain.md) 16 | 17 | ```SQL 18 | EXPLAIN explainable_stmt 19 | 20 | explainable_stmt: { 21 | SELECT statement 22 | | DELETE statement 23 | | INSERT statement 24 | | REPLACE statement 25 | | UPDATE statement 26 | } 27 | ``` 28 | 与MySQL语法区别 29 | 30 | 下文中红色表示不支持的语法或关键字 31 | ```diff 32 | -{EXPLAIN | DESCRIBE | DESC} 33 | - tbl_name [col_name | wild] 34 | 35 | -{ 36 | EXPLAIN 37 | - | DESCRIBE | DESC} 38 | - [explain_type] 39 | - { 40 | explainable_stmt 41 | - | FOR CONNECTION connection_id} 42 | 43 | -{EXPLAIN | DESCRIBE | DESC} ANALYZE [FORMAT = TREE] select_statement 44 | 45 | -explain_type: { 46 | - FORMAT = format_name 47 | -} 48 | 49 | -format_name: { 50 | - TRADITIONAL 51 | - | JSON 52 | - | TREE 53 | -} 54 | 55 | explainable_stmt: { 56 | SELECT statement 57 | - | TABLE statement 58 | | DELETE statement 59 | | INSERT statement 60 | | REPLACE statement 61 | | UPDATE statement 62 | } 63 | ``` 64 | 65 | 66 | 例: 67 | ``` 68 | explain SELECT select * from a_test where id=1; 69 | ``` 70 | 注意事项: 71 | 72 | 1. INSERT中表不能为自增序列表 73 | 74 | 2. 在dble中,EXPLAIN 不等价于于DESC 75 | 76 | 77 | 78 | ### 3.7.3 DESC 79 | DESC在dble中只负责查看数据表结构 80 | 81 | ```SQL 82 | {DESCRIBE | DESC} tbl_name [col_name | wild] 83 | 84 | ``` 85 | 86 | 与MySQL语法区别 87 | 88 | 下文中红色表示不支持的语法或关键字 89 | ```diff 90 | {EXPLAIN | DESCRIBE | DESC} 91 | tbl_name [col_name | wild] 92 | 93 | -{ 94 | -EXPLAIN 95 | - | DESCRIBE | DESC} 96 | - [explain_type] 97 | - { 98 | - explainable_stmt 99 | - | FOR CONNECTION connection_id} 100 | 101 | -{EXPLAIN | DESCRIBE | DESC} ANALYZE [FORMAT = TREE] select_statement 102 | 103 | -explain_type: { 104 | - FORMAT = format_name 105 | -} 106 | 107 | -format_name: { 108 | - TRADITIONAL 109 | - | JSON 110 | - | TREE 111 | -} 112 | 113 | -explainable_stmt: { 114 | - SELECT statement 115 | - | TABLE statement 116 | - | DELETE statement 117 | - | INSERT statement 118 | - | REPLACE statement 119 | - | UPDATE statement 120 | -} 121 | ``` 122 | 123 | 124 | 125 | 126 | 例: 127 | ``` 128 | DESC a_test id; 129 | ``` 130 | 131 | 注意: 在dble中,EXPLAIN 不等价于于DESC 132 | 133 | ### 3.7.4 EXPLAIN2 134 | 135 | 查询计划2用法见[2.17_explain](../2.Function/2.17_explain.md) 136 | 137 | ``` 138 | EXPLAIN2 shardingNode=node_name sql=sql_stmt 139 | ``` 140 | 141 | 例: 142 | ``` 143 | explain2 shardingNode=dn2 sql=select * from a_test where id=1; 144 | ``` 145 | 146 | ### 3.7.5 HELP Statement 不支持 147 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.8_Hint.md: -------------------------------------------------------------------------------- 1 | ## 3.8 Hint 2 | 3 | ### 3.8.1 分库分表-Syntax 4 | 5 | ``` 6 | /* { ! | #}dble: {sql=SELECT select_expr FROM table_references WHERE where_condition 7 | 8 | |shardingNode=shardingNode_name 9 | 10 | |db_type={slave|master}} 11 | 12 | */ ordinary_sql 13 | ``` 14 | 15 | ### 3.8.2 读写分离-Syntax 16 | 17 | ``` 18 | /* { ! | #}dble: {db_type={slave|master}} 19 | 20 | |db_instance_url={ip:port}} 21 | 22 | */ ordinary_sql 23 | /* master */ ordinary_sql 24 | /* uproxy_dest: ip:port */ ordinary_sql 25 | ``` 26 | 27 | 注意: 28 | * 在不影响sql语句完整性的前提下,`/* master */`和`/* uproxy_dest: ip:port */`可放在sql语句的首尾和中间 29 | 30 | ### 3.8.3 举例 31 | 32 | ``` 33 | /*!dble:sql=select 1 from sbtest */ call p_show_time(); 34 | /*!dble:shardingNode=dn1*/ update sbtest set name = 'test'; 35 | /*!dble:db_type=master*/ select count(*) from sbtest; 36 | /*!dble:db_instance_url=127.0.0.1:3307*/ select count(*) from sbtest; 37 | /*#dble:sql=select 1 from sbtest */ call p_show_time(); 38 | /*#dble:shardingNode=dn1*/ update sbtest set name = 'test'; 39 | /*#dble:db_type=master*/ select count(*) from sbtest; 40 | /*#dble:db_instance_url=127.0.0.1:3307*/ select count(*) from sbtest; 41 | select /* master */ * from sbtest; 42 | show processlist /* uproxy_dest: 127.0.0.1:3307 */ 43 | ``` 44 | 45 | 46 | -------------------------------------------------------------------------------- /3.SQL_Syntax/3.9_Other_unsupport.md: -------------------------------------------------------------------------------- 1 | ## 3.9 其他不支持语句 2 | 3 | + Compound-Statement Syntax 4 | + Replication Statements 5 | + DDL: 6 | + 不支持客户端针对database的操作语句,如alter database、drop database。create database 在客户端遇到会判断schema已经配置后返回ok,否则报错。 7 | + 不支持管理端针对database的操作语句,如alter database。 8 | + 不支持create table时的一些table option,如DATA DIRECTORY、ALGORITHM等,table option在alter table时也不能修改 9 | + 不支持ALTER TABLE ... LOCK ... 10 | + 不支持ALTER TABLE ... ORDER BY ... 11 | + 不支持create table ... select ... 12 | + 库名、表名不可修改,拆分字段的名称和类型都不可以变更 13 | + 不支持外键关联 14 | + 不支持临时表 15 | + 不支持分布式级别的存储过程和自定义函数 16 | + 不支持触发器 17 | + DML: 18 | + 对于INSERT... VALUES(expr),不支持expr中含有子查询 19 | + 支持部分INSERT... SELECT...举例 20 | ``` 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | ``` 29 | * 同一类型的有相同节点的表都支持,如insert into test10(id,name) select id,name from test11; insert into test30(id,name) select id,name from test31; 30 | * 不同类型的表不支持,如 insert into test30(id,score) select id,score from test10; 31 | * 同一类型的但是节点不同的表不支持, 如insert into test20(id,score) select id,score from test22;insert into test10(id,score) select id,score from test12; 32 | + 不支持不包含拆分字段的INSERT语句 33 | + 不支持HANDLER语句 34 | + 不支持修改拆分字段的值 35 | + 不支持DELETE ... ORDER BY ... LIMIT ... 36 | + 不支持DELETE/UPDATE ...LIMIT路由到一个分片表的多个节点 37 | + 不支持DO语句 38 | + 查询: 39 | + 不支持select ... use/ignore index ... 40 | + 不支持select ... group by ... with rollup 41 | + 不支持select ... for update | lock in share mode 正确语义 42 | + 不支持select ... into outfile ... 43 | + 不支持Row Subqueries 44 | + 不支持select ... union [all] select ... order by ...,可写成(select ...) union [all] (select ...) order by ... 45 | + 不支持session变量赋值与查询,如set @rowid=0;select @rowid:=@rowid+1,id from user; 46 | + 管理语句: 47 | + 不支持用户管理及权限管理语句 48 | + 不支持表维护语句,包括ANALYZE/CHECK/CHECKSUM/OPTIMIZE/REPAIR TABLE 49 | + 不支持INSTALL/UNINSTALL PLUGIN语句 50 | + 不支持BINLOG语句 51 | + 不支持CACHE INDEX/ LOAD INDEX INTO CACHE语句 52 | + 不支持除FLUSH TABLES [WITH READ LOCK]以外的其他FLUSH语句,FLUSH TABLE也仅语法支持无实际意义 53 | + 不支持RESET语句 54 | + 不支持大部分的运维SHOW语句,如SHOW PROFILES、SHOW ERRORS等 55 | 56 | -------------------------------------------------------------------------------- /4.Protocol/4.0_overview.md: -------------------------------------------------------------------------------- 1 | # 4 协议兼容 2 | 3 | * [4.1 基本包](4.1_Packet.md) 4 | * [4.2 连接建立](4.2_Connecting.md) 5 | * [4.3 文本协议](4.3_Text_Protocol.md) 6 | * [4.4 二进制协议 (Prepared Statements)](4.4_Binary_Protocol.md) 7 | * [4.5 服务响应包](4.5_Server_Response_Packets.md) 8 | 9 | -------------------------------------------------------------------------------- /4.Protocol/4.1_Packet.md: -------------------------------------------------------------------------------- 1 | ## 4.1 基本包 2 | - 标准包:支持 3 | - 大包(16M以上) :支持 4 | - 压缩包:支持, 需要全局配置,参见bootstrap.cnf 5 | - 压缩后的大包:不支持 6 | 7 | -------------------------------------------------------------------------------- /4.Protocol/4.3_Text_Protocol.md: -------------------------------------------------------------------------------- 1 | ## 4.3 文本协议 2 | 3 | ### 4.3.1 Supported 4 | 5 | * COM\_INIT_DB 6 | Specifies the default schema for the connection. 7 | * COM_PING 8 | Sends a packet containing one byte to check that the connection is active. 9 | * COM_QUERY 10 | Sends the server an SQL statement to be executed immediately.Support Multi-Statement. 11 | * COM_QUIT 12 | Client tells the server that the connection should be terminated. 13 | * COM\_SET_OPTION 14 | Enables or disables server option. 15 | * COM\_CHANGE_USER 16 | Resets the connection and re-authenticates with the given credentials. 17 | * COM\_RESET_CONNECTION 18 | Resets a connection without re-authentication. 19 | * 关闭后端连接(rollback & unlock) 20 | * 事务状态情况 21 | * 用户变量清空 22 | * 系统变量恢复成系统默认值 23 | * prepare清空 24 | * 上下文(字符集,隔离级别)恢复成为默认值 25 | * LAST_INSERT_ID 置零 26 | * COM\_FIELD_LIST 27 | MySQL Doc said that it is deprecated from 5.7.11 . But some tools are still use it, like OGG or MariaDB client. 28 | 29 | #### 4.3.1.1 Multi-Statement 30 | * Supported 31 | * DML:select/insert/update/replace/delete 32 | * DDL 33 | * OTHER 34 | * BEGIN; 35 | * COMMIT; 36 | * LOCK TABLE 37 | * UNLOCK TABLES 38 | * START 39 | * KILL 40 | * USE 41 | * ROLLBACK 42 | * MYSQL_CMD_COMMENT 43 | * MYSQL_COMMENT 44 | * SELECT VERSION_COMMENT ( SELECT @@VERSION_COMMENT) 45 | * SELECT DATABASE( select database() ) 46 | * SELECT USER(select user()) 47 | * SELECT VERSION (select version()) 48 | * SELECT SESSION_INCREMENT(select @@session.auto_increment_increment) 49 | * SELECT SESSION_ISOLATION(select @@session.tx_isolation) 50 | * SELECT LAST_INSERT_ID(select last_insert_id(#) as `id`) 51 | * SELECT IDENTITY(select @@identity) 52 | * SELECT SESSION_TX_READ_ONLY(select @@session.tx_read_only) 53 | * Not Supported 54 | * EXPLAIN 55 | * EXPLAIN2 56 | * DESCRIBE 57 | * SET 58 | * SHOW DATABASES/TABLES/TABLE_STATUS/COLUMNS/INDEX/CREATE_TABLE/VARIABLES/CREATE_VIEW/CHARSET 59 | * HELP 60 | * LOAD_DATA_INFILE_SQL 61 | * CREATE_VIEW 62 | * REPLACE_VIEW 63 | * ALTER_VIEW 64 | * DROP_VIEW 65 | 66 | ### 4.3.2 Not Supported 67 | * COM_DEBUG 68 | Forces the server to dump debug information to stdout 69 | * COM_STATISTICS 70 | Get internal server statistics. 71 | * COM\_CREATE_DB 72 | * COM\_DROP_DB 73 | 74 | 75 | ### 4.3.3 Internal 76 | 77 | * COM_SLEEP 78 | Used inside the server only. 79 | * COM_CONNECT 80 | an internal command in the server. 81 | * COM_TIME 82 | an internal command in the server. 83 | * COM_DAEMON 84 | an internal command in the server. 85 | * COM_DELAYED_INSERT 86 | an internal command in the server. 87 | 88 | ### 4.3.4 Deprecated 89 | 90 | * COM_PROCESS_INFO 91 | Deprecated from 5.7.11. 92 | * COM\_PROCESS_KILL 93 | Deprecated from 5.7.11. 94 | * COM_SHUTDOWN 95 | Deprecated from 5.7.9. 96 | * COM_REFRESH 97 | Deprecated from 5.7.11. 98 | 99 | 100 | -------------------------------------------------------------------------------- /4.Protocol/4.5_Server_Response_Packets.md: -------------------------------------------------------------------------------- 1 | ## 4.5 服务响应包 2 | 兼容支持: 3 | 4 | - EOF_Packet 5 | - ERR_Packet 6 | - OK_Packet 7 | - LOCAL_INFILE Packet 8 | - PACKET_LOCAL_INFILE 9 | - PACKET_RESULTSET 10 | 11 | -------------------------------------------------------------------------------- /4.Protocol/pic/4.4.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/4.Protocol/pic/4.4.1.png -------------------------------------------------------------------------------- /4.Protocol/pic/4.4.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/4.Protocol/pic/4.4.2.png -------------------------------------------------------------------------------- /4.Protocol/pic/4.4.3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/4.Protocol/pic/4.4.3.png -------------------------------------------------------------------------------- /4.Protocol/pic/4.4.4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/4.Protocol/pic/4.4.4.png -------------------------------------------------------------------------------- /5.Limit/5.0_overview.md: -------------------------------------------------------------------------------- 1 | # 5. 已知限制 2 | 3 | * [5.1 druid引发的限制](5.1_druid_limit.md) 4 | * [5.2 其他已知限制](5.2_other_limit.md) 5 | -------------------------------------------------------------------------------- /5.Limit/5.1_druid_limit.md: -------------------------------------------------------------------------------- 1 | ## 5.1 druid引发的限制 2 | 3 | 1. INSERT ... VALUE ... 和 INSERT ... VALUES ...这个两个语句中,VALUE[S]关键字必须写正确,否则会出现解析正常,但结果错误。 4 | 这个是由于druid的bug引起的。当VALUES[S]关键字错误时,druid会把这个错误的关键字当作别名处理。 5 | 已向druid提[issue2218](https://github.com/alibaba/druid/issues/2218) 。 6 | dble相关issue [dble_issue_379](https://github.com/actiontech/dble/issues/379). 7 | 8 | 2. 当开启黑名单时,`SHOW ALL TABLES`等dble的自定义语句可能不支持 9 | 10 | 3. 其他 11 | 参见 [dble_issue_788](https://github.com/actiontech/dble/issues/788) 12 | 13 | -------------------------------------------------------------------------------- /6.Differernce_from_MySQL_Server/6.0_overview.md: -------------------------------------------------------------------------------- 1 | # 6. 与MySQL Server的差异化描述 2 | 这里主要描述一些与MySQL Server不同的行为,这些行为不是bug,是分布式场景下的一些正常的行为表现,但与已知的MySQL行为不一致。 3 | 4 | * [6.1 事务中遇到主键冲突需要显式回滚](6.1_need_rollback.md) 5 | * [6.2 INSERT不能显式指定自增序列](6.2_insert_sequence.md) 6 | * [6.3 增加"show all tables"](6.3_add_show_all_tables.md) 7 | * [6.4 去除了增删改的message信息](6.4_remove_message.md) 8 | * [6.5 information_schema等库的支持](6.5_about_information_schema.md) 9 | -------------------------------------------------------------------------------- /6.Differernce_from_MySQL_Server/6.1_need_rollback.md: -------------------------------------------------------------------------------- 1 | ## 6.1 事务中遇到主键冲突需要显式回滚,MySQL不需要 2 | 具体表现如下: 3 | 4 | MYSQL行为: 5 | 6 | [test_yhq]>select * from char_columns_4; 7 | +----+--------+ 8 | | id | c_char | 9 | +----+--------+ 10 | | 1 | xx | 11 | | 4 | z | 12 | +----+--------+ 13 | 2 rows in set (0.02 sec) 14 | [test_yhq]>begin; 15 | Query OK, 0 rows affected (0.01 sec) 16 | 17 | [test_yhq]>insert into char_columns_4 values(1,'yy'); 18 | ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' 19 | [test_yhq]>insert into char_columns_4 values(2,'yy'); 20 | Query OK, 1 row affected (0.00 sec) 21 | 22 | [test_yhq]>commit; 23 | Query OK, 0 rows affected (0.02 sec) 24 | dble行为: 25 | 26 | [testdb]>select * from sharding_four_node order by id; 27 | +----+--------+-----------+ 28 | | id | c_flag | c_decimal | 29 | +----+--------+-----------+ 30 | | 1 | 1_1 | 1.0000 | 31 | | 2 | 2 | 2.0000 | 32 | | 3 | 3 | 3.0000 | 33 | +----+--------+-----------+ 34 | 3 rows in set (0.28 sec) 35 | 36 | begin; 37 | Query OK, 0 rows affected (0.01 sec) 38 | 39 | [testdb]>insert into sharding_four_node values(1,'1',1.0); 40 | ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' 41 | [testdb]>insert into sharding_four_node values(13,'13',13.0); 42 | ERROR 1003 (HY000): Transaction error, need to rollback.Reason:[ errNo:1062 Duplicate entry '1' for key 'PRIMARY'] 43 | [testdb]>commit; 44 | ERROR 1003 (HY000): Transaction error, need to rollback.Reason:[ errNo:1062 Duplicate entry '1' for key 'PRIMARY'] 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /6.Differernce_from_MySQL_Server/6.2_insert_sequence.md: -------------------------------------------------------------------------------- 1 | ## 6.2 INSERT自增序列表由dble生成,不能显式指定自增列,MySQL可以。 2 | 具体表现如下: 3 | 4 | MySQL行为: 5 | 6 | desc mysql_autoinc; 7 | +--------+------------+------+-----+---------+----------------+ 8 | | Field | Type | Null | Key | Default | Extra | 9 | +--------+------------+------+-----+---------+----------------+ 10 | | c_char | char(255) | YES | | NULL | | 11 | | id | bigint(20) | NO | PRI | NULL | auto_increment | 12 | +--------+------------+------+-----+---------+----------------+ 13 | 2 rows in set (0.02 sec) 14 | 15 | [test_yhq]>insert into mysql_autoinc values('1',1); 16 | Query OK, 1 row affected (0.01 sec) 17 | dble行为 18 | 19 | desc sharding_four_node_autoinc; 20 | +--------+------------+------+-----+---------+----------------+ 21 | | Field | Type | Null | Key | Default | Extra | 22 | +--------+------------+------+-----+---------+----------------+ 23 | | c_char | char(255) | YES | | NULL | | 24 | | id | bigint(20) | NO | PRI | NULL | auto_increment | 25 | +--------+------------+------+-----+---------+----------------+ 26 | 2 rows in set (0.01 sec) 27 | [testdb]>insert into sharding_four_node_autoinc values('2',2); 28 | ERROR 1064 (HY000): In insert Syntax, you can't set value for Autoincrement column! 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /6.Differernce_from_MySQL_Server/6.3_add_show_all_tables.md: -------------------------------------------------------------------------------- 1 | ## 6.3 ADD "show all tables" 2 | The optional ALL modifier causes SHOW TABLES to display a second output column with values of BASE TABLE for a table ,VIEW for a view, SHARDING TABLE for a sharding table and GLOBAL TABLE for a global table. 3 | 4 | 具体表现如下: 5 | 6 | 7 | [testdb]>show all tables; 8 | +----------------------------+----------------+ 9 | | Tables in testdb | Table_type | 10 | +----------------------------+----------------+ 11 | | global_four_node | GLOBAL TABLE | 12 | | global_four_node_autoinc | GLOBAL TABLE | 13 | | global_two_node | GLOBAL TABLE | 14 | | sbtest1 | SHARDING TABLE | 15 | | sharding_four_node | SHARDING TABLE | 16 | | sharding_four_node2 | SHARDING TABLE | 17 | | sharding_four_node_autoinc | SHARDING TABLE | 18 | | sharding_two_node | SHARDING TABLE | 19 | | single | SHARDING TABLE | 20 | | customer | BASE TABLE | 21 | | district | BASE TABLE | 22 | +----------------------------+----------------+ 23 | 11 rows in set (0.02 sec) 24 | 25 | -------------------------------------------------------------------------------- /6.Differernce_from_MySQL_Server/6.4_remove_message.md: -------------------------------------------------------------------------------- 1 | ## 6.4 去除了增删改的message 信息 2 | 具体表现如下: 3 | 4 | MySQL行为: 5 | ``` 6 | mysql> insert into sharding_two_node values(9,'9',9.0),(10,'10',10.0); 7 | Query OK, 2 rows affected (0.24 sec) 8 | Records: 2 Duplicates: 0 Warnings: 0 9 | ``` 10 | dble行为: 11 | ``` 12 | mysql> insert into sharding_two_node values(11,'11',11.0),(12,'12',12.0); 13 | Query OK, 2 rows affected (0.49 sec) 14 | ``` 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /6.Differernce_from_MySQL_Server/6.5_about_information_schema.md: -------------------------------------------------------------------------------- 1 | ## 6.5 information_schema等库的支持 2 | 3 | ### 背景 4 | 用户使用 Navicat Premium 12 连接dble时,Navicat Premium 12会查询 information_schema,mysql 等数据库中系统表的数据。 5 | dble 需要支持查询这些系统表的语句,保证这些 driver 的正常使用。 6 | 7 | #### Navicat Premium12 8 | ##### 1. SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA; 9 | 该语句查询当前 mysql 实例中的所有 scheme的名称,character set 以及 collation。该语句会影响Navicat Premium 12的使用。 10 | dble中的scheme是逻辑上的,可以通过 SchemeConfig 获取所有 scheme 的名称,scheme 的 character set 以及 collation 使用默认返回。 11 | 问题1:dble中的scheme是逻辑上的,会对应多个shardingNode,会出现shardingNode的 character set 以及 collation 与 默认character set 和 collation 不同,需要运维安装MySQL时候保证。 12 | 问题2:当前dble中处理 SCHEMATA 系统表时,只是对表名做了判断,并未对查询字段做检验。 13 | 14 | 15 | #### 以下语句不影响driver的使用 16 | 对此种语句的处理是根据请求字段,伪造一个行数为0的报文返回。 17 | 18 | ``` 19 | 1. SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE 20 | FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'testdb' 21 | ORDER BY TABLE_SCHEMA, TABLE_TYPE 22 | 2. SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, COLUMN_TYPE 23 | FROM information_schema.COLUMNS 24 | WHERE TABLE_SCHEMA = 'testdb' 25 | ORDER BY TABLE_SCHEMA, TABLE_NAME 26 | 3. SELECT DISTINCT ROUTINE_SCHEMA, ROUTINE_NAME, PARAMS.PARAMETER 27 | FROM information_schema.ROUTINES LEFT JOIN 28 | ( SELECT SPECIFIC_SCHEMA, SPECIFIC_NAME, 29 | GROUP_CONCAT(CONCAT(DATA_TYPE, ' ', PARAMETER_NAME) ORDER BY ORDINAL_POSITION SEPARATOR ', ') PARAMETER, ROUTINE_TYPE 30 | FROM information_schema.PARAMETERS GROUP BY SPECIFIC_SCHEMA, SPECIFIC_NAME, ROUTINE_TYPE 31 | )PARAMS 32 | ON ROUTINES.ROUTINE_SCHEMA = PARAMS.SPECIFIC_SCHEMA AND 33 | ROUTINES.ROUTINE_NAME = PARAMS.SPECIFIC_NAME AND 34 | ROUTINES.ROUTINE_TYPE = PARAMS.ROUTINE_TYPE 35 | WHERE ROUTINE_SCHEMA = 'testdb' ORDER BY ROUTINE_SCHEMA 36 | 4. SELECT TABLE_NAME, CHECK_OPTION, IS_UPDATABLE, SECURITY_TYPE, DEFINER 37 | FROM information_schema.VIEWS 38 | WHERE TABLE_SCHEMA = 'testdb' ORDER BY TABLE_NAME ASC 39 | 5. SELECT * FROM information_schema.ROUTINES 40 | WHERE ROUTINE_SCHEMA = 'testdb' ORDER BY ROUTINE_NAME 41 | 6. SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, TIME_ZONE, 42 | EVENT_DEFINITION, EVENT_BODY, EVENT_TYPE, SQL_MODE, STATUS, EXECUTE_AT, 43 | INTERVAL_VALUE, INTERVAL_FIELD, STARTS, ENDS, ON_COMPLETION, CREATED, 44 | LAST_ALTERED, LAST_EXECUTED, ORIGINATOR, CHARACTER_SET_CLIENT, 45 | COLLATION_CONNECTION, DATABASE_COLLATION, EVENT_COMMENT 46 | FROM information_schema.EVENTS WHERE EVENT_SCHEMA = 'testdb' 47 | ORDER BY EVENT_NAME ASC 48 | 7. SELECT COUNT(*) FROM information_schema.TABLES 49 | WHERE TABLE_SCHEMA = 'testdb' UNION 50 | SELECT COUNT(*) 51 | FROM information_schema.COLUMNS 52 | WHERE TABLE_SCHEMA = 'testdb' UNION 53 | SELECT COUNT(*) FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = 'testdb' 54 | 55 | ``` 56 | 57 | 58 | -------------------------------------------------------------------------------- /7.Developer_Notice/7.0_overview.md: -------------------------------------------------------------------------------- 1 | # 7 开发者须知 2 | 3 | * [7.1 SQL开发编写原则](7.1_SQL_develop_rule.md) 4 | * [7.2 dble连接Demo](7.2_Demo_for_connect_dble.md) 5 | * [7.3 其他注意事项](7.3_Other_Notice.md) 6 | 7 | -------------------------------------------------------------------------------- /7.Developer_Notice/7.1_SQL_develop_rule.md: -------------------------------------------------------------------------------- 1 | ## 7.1 SQL开发编写原则 2 | + 分布式数据库处理的是分布式关系运算,其SQL的优化方法与单机关系数据库有所不同,侧重考虑的分布式环境中的网络开销。分布式执行计划中,应该尽量将SQL中的运算下推到底层各个节点执行,避免跨节点运算,从而减少网络开销、提升SQL执行效率。 3 | 4 |

1)执行计划

5 | 访问数据时的一组有序的操作步骤集合,称为执行计划。dble的执行计划分为两个层次:dble层的执行计划与节点层的执行计划。对执行计划进行分析,可以了解中间件和节点是否对SQL语句生成了最优的执行计划,是否有优化的空间,从而为SQL优化提供重要的参考信息。 6 | 在SQL语句执行前,dble会根据SQL语句的基本信息,判断该SQL语句应该在哪些节点上执行,将SQL改写成在节点上执行的具体形式,并决定采用何种策略进行数据合并与计算等,这就是 dble层的执行计划。节点层的执行计划就是原生的MySQL执行计划。 7 | dble用EXPLAIN指令来查看dble层的执行计划。如: 8 |
explain select id,accountno from account where userid=2;
9 | EXPLAIN指令的执行结果包括语句下发的节点,实际下发的SQL语句和数据的合并操作的信息。这些信息是系统静态分析产生的,并没有真正的执行语句。 10 | 通过EXPLAIN2命令可查看指定节点上的执行计划。如: 11 |
explain2 shardingNode=dn1 sql=select id,accountno from account where userid=2;
12 | explain2会将sql语句加上explain下发到指定的shardingNode执行,并把节点上explain的结果返回调用者。 13 | 14 |

2)SQL优化

15 | 16 | 对于SQL优化有以下原则: 17 | + SQL语句中尽可能带有拆分字段,并且拆分字段过滤条件的取值范围越小,越有助于提高查询速度。在数据写入时,必须给拆分字段赋值。 18 | + 拆分字段的查询条件尽可能是等值条件。 19 | + 如果拆分字段的条件是IN子句,则IN后面的值的数目应尽可能少。特别注意,随着业务增长,某些IN子句的条件会随之增长。 20 | + 如果SQL语句不带有拆分字段,那么DISTINCT、GROUP BY和ORDER BY在同一个SQL语句中尽量只出现一种。 21 | + 数据查询时,应该尽量减少节点返回的结果数量,这样能够使消耗的网络带宽最小,使查询性能能够达到最优状态。 22 | 23 |

3)跨节点查询

24 | 25 | 跨节点查询通常发生在下列语句中: 26 | + 涉及多个分片的分布式 Join; 27 | + 涉及多个分片的聚合函数; 28 | + 复杂子查询。 29 | 30 | 这些语句可以通过以下策略来优化: 31 | + 合理调整查询语句,使查询条件中包含拆分字段的等值条件,这样就能够将语句下推到单一节点执行。 32 | + 参与Join的表配置相同的拆分规则,查询时将拆分字段作为Join的关联条件,这样Join操作就可以在节点内完成。 33 | + 将参与Join的表中数据量较小的表配置成全局表,通过数据冗余避免跨节点。 34 | + 如果一定需要跨节点Join,尽量对驱动表添加更多的过滤条件,从而使参与跨节点Join的数据量尽可能的少。 35 | + 如果查询涉及到了多个节点,则尽量不要使用limit a,b这样的子句 36 | + GROUP子句尽量包含拆分字段。 37 | + 对语句进行改写,将复杂子查询分解为多条语句来执行。 38 | + 子查询尽可能改写成Join的形式。 39 | 40 | -------------------------------------------------------------------------------- /7.Developer_Notice/7.3_Other_Notice.md: -------------------------------------------------------------------------------- 1 | ## 7.3 其他注意事项 2 | + 在应用分布式数据库时,首先要考虑清楚,是否真的需要分片,在所有环境下分片都是不得已的选择,必然会增加研发、运维、管理的复杂度,现在有很多技术例如分区、复制、缓存等都能提高系统的处理速度和吞吐量,也许我们应用这些技术能够实现技术目标而无需分片 3 | + 数据分片之前,请确保已经对单机数据库做了优化,包括系统架构、硬件、MySQL版本、数据读写模式等,数据分片之后这些优化依然非常有意义 4 | + 配置拆分规则时,还应该同时考虑运维的复杂性,以及未来系统的扩容。 5 | + 数据量较大时,DDL语句会耗时较多,分布式环境下这个问题会更加突出,因此应尽量在业务空闲时进行DDL操作。 6 | -------------------------------------------------------------------------------- /8.Configuration_samples/8.0_overview.md: -------------------------------------------------------------------------------- 1 | # 8 配置示例 2 | 3 | * [8.1 时间戳方式全局序列的配置](8.1_timestamp_sequence_table.md) 4 | * [8.2 MySQL-offset-step 方式全局序列的配置](8.2_MySQL-offset-step_sequence_table.md) 5 | -------------------------------------------------------------------------------- /8.Configuration_samples/8.1_timestamp_sequence_table.md: -------------------------------------------------------------------------------- 1 | ## 8.1 时间戳方式全局序列的配置 2 | 3 | 配置表tb的id列为时间戳方式全局序列,并按id列分片 4 | 5 | ### 1)cluster.conf 6 | 7 | ``` 8 | sequenceHandlerType=2 9 | sequenceStartTime=2010-10-01 09:42:54 10 | ... 11 | ``` 12 | 13 | 14 | ### 2)bootstrap.conf 15 | 16 | ``` 17 | instanceId=1 18 | ... 19 | ``` 20 | 21 | ### 3)user.xml 22 | 23 | ```xml 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | ``` 32 | 33 | ### 4)db.xml 34 | 35 | 36 | ```xml 37 | 38 | 39 | 40 | select USER() 41 | 42 | 43 | 44 | select USER() 45 | 46 | 47 | 48 | ``` 49 | 50 | 51 | ### 5)sharding.xml 52 | 53 | 54 | ```xml 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 2 64 | 1 65 | 66 | 67 | ``` 68 | 69 | 70 | ### 6 )实验 71 | ```mysql 72 | mysql -utest -p111111 -h127.0.0.1 -P8066 -Dmyschema 73 | mysql> drop table if exists sbtest1; 74 | Query OK, 0 rows affected (0.05 sec) 75 | mysql> create table sbtest1(id bigint(20), k int unsigned not null default '0', primary key(id)); 76 | Query OK, 0 rows affected (0.05 sec) 77 | 78 | mysql> insert into sbtest1 values(2); 79 | Query OK, 1 row affected (0.11 sec) 80 | 81 | mysql> select * from sbtest1; 82 | 查看序列 83 | 84 | 注意事项,自增列的数据类型要是bigint 85 | 86 | -------------------------------------------------------------------------------- /9.Sysbench_samples/9.0_overview.md: -------------------------------------------------------------------------------- 1 | # 9 sysbench压测dble示例 2 | 3 | * [9.1 测试环境及架构](9.1_env.md) 4 | * [9.2 修改dble配置](9.2_conf.md) 5 | * [9.3 使用sysbench进行压测](9.3_use_sysbench.md) 6 | -------------------------------------------------------------------------------- /9.Sysbench_samples/9.1_env.md: -------------------------------------------------------------------------------- 1 | ## 9.1 测试环境及架构 2 | 3 |

版本信息

4 | 5 | + Sysbench version: 1.0 6 | + Dble version: 5.6.23-dble-2.19.11.0-2d7c4911b7a4fecaa9eb0299f49c32ec11e97c42-20200228124218 7 | + MySQL version: 5.7.25 8 | 9 |

测试架构

10 | 11 | + sysbench独立服务器(172.20.134.1) 12 | + dble独立服务器(172.20.134.2) 13 | + 3台mysql独立服务器(172.20.134.3,172.20.134.4,172.20.134.5) 14 | -------------------------------------------------------------------------------- /9.Sysbench_samples/9.2_conf.md: -------------------------------------------------------------------------------- 1 | ## 9.2 修改dble配置 2 | 3 | 说明: 4 | 此配置仅为示例配置,并非调优配置,请根据运行环境自行调优,调优步骤参考:[2.18 性能观测以及调试概览](../2.Function/2.18_performance_observation.md) 5 | 6 | ### 1. bootstrap.cnf 7 | 调整如下参数 8 | -DNIOFrontRW=10 9 | -DNIOBackendRW=10 10 | -DfrontWorker=8 11 | -DbackendWorker=6 12 | -DsqlExecuteTimeout=3000000 13 | 14 | ### 2.user.xml 15 | 16 | ```xml 17 | 18 | 19 | 20 | 21 | 22 | 23 | ``` 24 | 25 | 26 | ### 3.db.xml 27 | 28 | ```xml 29 | 30 | 31 | 32 | select USER() 33 | 34 | 35 | 36 | select USER() 37 | 38 | 39 | 40 | select USER() 41 | 42 | 43 | 44 | 45 | 46 | 47 | ``` 48 | 49 | ### 4.sharding.xml 50 | 51 | ```xml 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 9 62 | 1 63 | 64 | 65 | ``` 66 | 67 | ### 5.在后端mysql节点创建相应物理库 68 | 69 | + 172.20.134.3:3306 创建库:dbledb1, dbledb2, dbledb3 70 | + 172.20.134.4:3306 创建库:dbledb4, dbledb5, dbledb6 71 | + 172.20.134.5:33066 创建库:dbledb7, dbledb8, dbledb9 72 | -------------------------------------------------------------------------------- /9.Sysbench_samples/9.3_use_sysbench.md: -------------------------------------------------------------------------------- 1 | ## 9.3 使用sysbench进行压测 2 | 说明: 3 | 如果在压测中遇到问题请参考:[how about a sysbench-testing-quick-start](https://github.com/actiontech/dble/issues/458); 4 | 如果在此参考中未包括您遇到的问题请在issue下添加评论,将问题及配置做出说明。 5 | 注意: 6 | 使用sysbench压测语句,在高并发下会出现主键冲突的报错。 7 | ``` 8 | FATAL: mysql_drv_query() returned error 1062 (Duplicate entry '49823' for key 'PRIMARY') for query 'INSERT INTO sbtest1 (id, k, c, pad) VALUES (49823, 58210, '27111667985-11552069038-79242882109-05602914209-02374993639-32242662584-65155028223-08319627673-44873060047-22215118936', '07405724915-32799061660-96650146042-59717172693-66753749407')' 9 | ``` 10 | 解决方式见如上链接。 11 | 12 | 数据清理: 13 | > /usr/share/sysbench/oltp_read_write.lua --mysql-db=sbtest --mysql-host=172.20.134.2 --mysql-port=8066 --mysql-user=test --mysql-password=111111 --auto_inc=off --tables=1 --table-size=100000 --threads=4 --time=30 --report-interval=1 --max-requests=0 --percentile=95 --db-ps-mode=disable --skip-trx=on cleanup 14 | 15 | 16 | 数据准备: 17 | > /usr/share/sysbench/oltp_read_write.lua --mysql-db=sbtest --mysql-host=172.20.134.2 --mysql-port=8066 --mysql-user=test --mysql-password=111111 --auto_inc=off --tables=1 --table-size=100000 --threads=4 --time=30 --report-interval=1 --max-requests=0 --percentile=95 --db-ps-mode=disable --skip-trx=on prepare 18 | 19 | 执行压测: 20 | > /usr/share/sysbench/oltp_read_write.lua --mysql-db=sbtest --mysql-host=172.20.134.2 --mysql-port=8066 --mysql-user=test --mysql-password=111111 --auto_inc=off --tables=1 --table-size=100000 --threads=4 --time=30 --report-interval=1 --max-requests=0 --percentile=95 --db-ps-mode=disable --skip-trx=on run 21 | -------------------------------------------------------------------------------- /A.Faq/A_overview.md: -------------------------------------------------------------------------------- 1 | * [A.1 ErrorCode](ErrorCode) 2 | * [A.2 原理解释](Internals) 3 | * [A.3 使用说明](Usage) 4 | -------------------------------------------------------------------------------- /A.Faq/ErrorCode/A_overview1.md: -------------------------------------------------------------------------------- 1 | * [Max Connections](Content/MaxConnections.md) 2 | * [Out Of Memory Error](Content/OutOfMemoryError.md) 3 | * [The Problem Of Hint](Content/TheProblemOfHint.md) 4 | * [NestLoop Parameters Lead To Temptable Exception](Content/NestLoopParametersLeadToTemptableException.md) 5 | * [Can't Get Variables From ShardingNode](Content/Can'tGetVariablesFromShardingNode.md) 6 | * [Port Already In Use 1984](Content/PortAlreadyInUse1984.md) 7 | * [Sharding Column Cannot Be Null](Content/ShardingColumnCannotBeNull.md) 8 | -------------------------------------------------------------------------------- /A.Faq/ErrorCode/Content/Can'tGetVariablesFromShardingNode.md: -------------------------------------------------------------------------------- 1 | # dble-Can't get variables from shardingNode 2 | 3 | ## Setting 4 | 5 | 6 | 7 | - db.xml 片段 8 | 9 | ``` 10 | 11 | show slave status 12 | 13 | 14 | 15 | show slave status 16 | 17 | ``` 18 | 19 | ## Issue 20 | 21 | - 查看dble启动日志: 22 | 23 | ``` 24 | Running dble-server... 25 | wrapper | --> Wrapper Started as Console 26 | wrapper | Launching a JVM... 27 | jvm 1 | Wrapper (Version 3.2.3) 28 | http://wrapper.tanukisoftware.org 29 | jvm 1 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved. 30 | jvm 1 | 31 | jvm 1 | java.io.IOException:Can't get variables from shardingNode ... 32 | wrapper | <-- Wrapper Stopped 33 | ``` 34 | 35 | ## Resolution 36 | 37 | 1. 检查mysql版本及是否正常启动,不支持mysql5.1,请升级mysql, 如果启动正常见下一步; 38 | 2. db.xml中的root用户能否通过配置文件的信息连接mysql,连接成功见下一步; 39 | 3. 检查root用户权限; 40 | 4. 连接mysql,并执行show variables命令,未执行成功见下一步; 41 | 5. 修改配置文件中dbGroup指定的后端数据库密码,更新配置文件,dble正常启动 42 | 43 | ## Root Cause 44 | 45 | - 通过db.xml 配置信息成功连接mysql后,并不能执行show variables 46 | - 由于mysql 5.7 初始化之后,首次使用随机密码登陆,没有修改密码,无法对数据库进行操作 47 | 48 | ## Relevant Content 49 | 50 | 1. 安装好mysql5.7后,第一次初始化数据库 51 | 2. 随机密码登录mysql,首次登录后,mysql要求必须修改默认密码,否则不能执行任何其他数据库操作,这样体现了不断增强的Mysql安全性。 52 | 3. 第一次登陆后必须更改密码: 53 | - mysql> show databases; 54 | - ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. 55 | - mysql > set password = password('xxxxxx'); 56 | -------------------------------------------------------------------------------- /A.Faq/ErrorCode/Content/MaxConnections.md: -------------------------------------------------------------------------------- 1 | # dble-MaxConnections 2 | 3 | ## Issue 4 | 5 | - [Err] 3009 - java.io.IOException: the max activeConnnections size can not be max than maxconnections. 6 | 7 | ## Resolution 8 | 9 | 1. 检查是否使用了过多的短链,导致频繁建立连接,链接池不够用 10 | >**注意**:不要过多的使用短链,容易消耗dble资源 11 | 2. maxCon配置过小,调大maxCon 12 | 13 | | 配置名称 | 配置内容 | 默认值/单位 | 作用原理或应用 | 14 | | ---- | ---- | ---- | ----| 15 | | maxCon | 控制最大连接数 | 默认1024 | 大于此连接数之后,建立连接会失败.注意当各个用户的maxcon总和值大于此值时,以当前值为准 全局maxCon不作用于manager用户 | 16 | 17 | ## Root Cause 18 | 19 | 配置的链接池数量不够用,导致报错。 20 | 21 | ## Relevant Content 22 | 23 | **数据库连接池** 24 | 1. **maxWait** 25 | 从连接池获取连接的超时等待时间,单位毫秒。 26 | > **注意**:maxActive不要配置过大,虽然业务量飙升后还能处理更多的请求,但其实连接数的增多在很多场景下反而会减低吞吐量 27 | 28 | 2. **connectionProperties** 29 | 可以配置 connectTimeout 和 socketTimeout,单位都是毫秒。 30 | connectTimeout 配置建立 TCP 连接的超时时间;socketTimeout 配置发送请求后等待响应的超时时间。 31 | > **注意**:不设置这两项超时时间,服务会有高的风险。 32 | > 例如网络异常下 socket 没有办法检测到网络错误,如果没有设置 socket 网络超时,连接就会一直等待 DB 返回结果,造成新的请求都无法获取到连接。 33 | 34 | 3. **maxActive** 35 | 最大连接池数量,允许的最大同时使用中的连接数。 36 | >**注意**:当业务出现大流量涌入时,连接池耗尽,maxWait未配置或者配置为 0 时将无限等待,导致等待队列越来越长,表现为业务接口大量超时,实际吞吐越低。 37 | -------------------------------------------------------------------------------- /A.Faq/ErrorCode/Content/NestLoopParametersLeadToTemptableException.md: -------------------------------------------------------------------------------- 1 | # dble-NestLoop Parameters Lead To Temptable Exception 2 | 3 | ## Setting 4 | 5 | - 开启了NestLoop优化,设置NestLoop值的范围为4 6 | - 两个表join关联:student表和class表 7 | - student表结构:id列、name列、class_name列,主键id 8 | - class表结构:id列,class_name列、teacher_name列 9 | - `SELECT class.teacher_name FROM student LEFT JOIN class on student.class_name=class.class_name WHERE student.name="张三";` 10 | 11 | ## Issue 12 | 13 | - com.actiontech.dble.plan.common.exception.TempTableException: temptable too much rows,[rows size is 5]. 14 | 15 | ## Resolution 16 | 17 | - 调大NestLoop中的默认参数值,如下: 18 | 19 | | 配置名称 | 配置内容 | 默认值/单位 | 详细作用原理或应用 | 20 | | ---- | ---- | ---- | ----| 21 | | useJoinStrategy | 是否使用nestLoop优化 | 默认不使用 | 开启之后会尝试判断join两边的where来重新调整查询SQL下发的顺序 | 22 | | nestLoopConnSize | 临时表阈值 | 默认4 | 若临时表⾏数⼤于这两个值乘积,则报告错误 | 23 | | nestLoopRowsSize | 临时表阈值 | 默认2000 | 若临时表⾏数⼤于这两个值乘积,则报告错误 | 24 | 25 | - 或者关闭NestLoop,不使用其优化,如下: 26 | - `false` 27 | - 为了更直观,本例提前调小参数值,引发场景复现 28 | 29 | ## Root Cause 30 | 31 | - 使用了NestLoop优化,但是依据NestLoop规则选择出的表数据量太大,超出了NestLoop默认范围 32 | - NestLoop优化规范 33 | > **注意**: 34 | > - 对于两表join时,NestLoop选择小表作为驱动表 (同样适用于多join) 35 | > - 判断依据:是否有where条件,有where条件的作为小表 36 | > - 当两个表都有where条件或者都没有where条件,NestLoop无法判断,不起作用 37 | > - 在不确定哪个表为小表时,不建议开启NestLoop 38 | 39 | - 针对本例SQL做详细说明:如下 40 | - `SELECT class.teacher_name FROM student LEFT JOIN class on student.class_name=class.class_name WHERE student.name="张三"; ` 41 | 42 | 根据dble中NestLoop优化规则可知: 43 | 1. SQL中使用了student表和class表 44 | 2. where条件限制指定于student表,所以NestLoop可以根据规则选择出student表作为驱动表(小表) 45 | 3. 实际SQL中student表的数据量较大,超出了NestLoop值的范围,引发报错 46 | 47 | ## Relevant Content 48 | 49 | **MySQL的多表连接之NestLoop介绍** 50 | 51 | 1. NestLoop: 52 | - 对于被连接的数据子集较小的情况,Nested Loop是个较好的选择。 53 | - Nested Loop就是扫描一个表(外表),每读到一条记录,就根据Join字段上的索引去另一张表(内表)里面查找,若Join字段上没有索引查询优化器一般就不会选择 Nested Loop。 54 | - 在Nested Loop中,内表(一般是带索引的大表)被外表(也叫“驱动表”,一般为小表——不紧相对其它表为小表,而且记录数的绝对值也较小,不要求有索引)驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查询返回的结果集不能太大。 55 | 56 | 2. NestLoop优缺点 57 | 58 | | 类别 | 使用条件 | 相关资源 | 特点 | 缺点 | 59 | | ---- | ---- | ---- | ---- | ---- | 60 | | NestLoop | 任何条件 | CPU、磁盘I/O | 当有高选择性索引或进行限制性搜索时效率比较高,能够快速返回第一次的搜索结果。| 当索引丢失或者查询条件限制不够时,效率很低;当表记录数多时,效率低。 | 61 | -------------------------------------------------------------------------------- /A.Faq/ErrorCode/Content/OutOfMemoryError.md: -------------------------------------------------------------------------------- 1 | # dble-OutOfMemoryError 2 | 3 | ## Setting 4 | 5 | load data语句,一共有17G的数据,每条语句4K 6 | load data相关参数值均为默认 7 | 8 | ## Issue 9 | - INFO | jvm 1 | 2019/06/28 14:55:37 | Exception in thread "backendBusinessExecutor17" java.lang.OutOfMemoryError: GC overhead limit exceeded. 10 | 11 | Special instructions:backendBusinessExecutor17 被替换成了17-backendWorker 12 | ## Resolution 13 | 14 | 1. 调小maxRowSizeToFile参数值,减少占用内存量 15 | 16 | | 配置名称 | 配置内容 | 默认值 | 详细作用原理或应用 | 17 | | ---- | ---- | ---- | ----| 18 | | maxCharsPerColumn | 每列所允许最⼤字符数 | 默认为65535 | 每⾏所允许最⼤字符数 | 19 | | maxRowSizeToFile | 需要持久化的最⼤⾏数 | 默认为10000 | 当load data的数据⾏数超过阈值后,会将数据保存在⽂件中以防OOM | 20 | 21 | 2. 调大wrapper.conf中的Xmx值 22 | > **注意**:发生OOM,可以关注一下这个值的大小是否配置合适 23 | 24 | ## Root Cause 25 | 26 | 1. maxRowSizeToFile参数设置过大,对于机器来说超出了承载的数据量,导致内存溢出 27 | 2. 配置文件中Xmx设置过小,内存不够 28 | >**注意**:On-Heap ⼤⼩由JVM 参数Xms ,Xmx 决定,就是正常服务需要的内存,由jvm⾃动分配和回收。 29 | 30 | ## Relevant Content 31 | 32 | **load data相关配置** 33 | 34 | 设置load data相关参数时,不要过度的调大,防止OOM 35 | 36 | **JVM配置** 37 | 38 | 以下为建议值: 39 | 1. dble总内存=0.6 可⽤物理内存(刨除操作系统,驱动等的占⽤) 40 | 2. Xmx = 0.4 dble总内存 41 | 3. MaxDirectMemorySize = 0.6 * dble总内存 42 | 43 | **堆内存分配** 44 | 45 | 1. JVM初始分配的内存由-Xms指定,默认是物理内存的1/64; 46 | 2. JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。 47 | 3. 默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。 48 | -------------------------------------------------------------------------------- /A.Faq/ErrorCode/Content/PortAlreadyInUse1984.md: -------------------------------------------------------------------------------- 1 | # dble-Port already in use:1984 2 | 3 | ## Issue 4 | 5 | - wrapper.log-Error1 6 | ``` 7 | STATUS | wrapper | 2019/07/23 16:37:06 | --> Wrapper Started as Daemon 8 | STATUS | wrapper | 2019/07/23 16:37:06 | Launching a JVM... 9 | INFO | jvm 1 | 2019/07/23 16:37:06 | OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0 10 | INFO | jvm 1 | 2019/07/23 16:37:07 | 错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1984; nested exception is: 11 | INFO | jvm 1 | 2019/07/23 16:37:07 | java.net.BindException: Address already in use (Bind failed) 12 | INFO | jvm 1 | 2019/07/23 16:37:07 | sun.management.AgentConfigurationError: java.rmi.server.ExportException: Port already in use: 1984; 13 | ``` 14 | 15 | - wrapper.log-Error2 16 | ``` 17 | STATUS | wrapper | 2019/07/26 16:12:48 | --> Wrapper Started as Daemon 18 | STATUS | wrapper | 2019/07/26 16:12:49 | Launching a JVM... 19 | INFO | jvm 1 | 2019/07/26 16:12:49 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org 20 | INFO | jvm 1 | 2019/07/26 16:12:49 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved. 21 | INFO | jvm 1 | 2019/07/26 16:12:49 | 22 | INFO | jvm 1 | 2019/07/26 16:12:51 | java.net.BindException: Address already in use 23 | INFO | jvm 1 | 2019/07/26 16:12:51 | at sun.nio.ch.Net.bind0(Native Method) 24 | INFO | jvm 1 | 2019/07/26 16:12:51 | at sun.nio.ch.Net.bind(Net.java:433) 25 | INFO | jvm 1 | 2019/07/26 16:12:51 | at sun.nio.ch.Net.bind(Net.java:425) 26 | INFO | jvm 1 | 2019/07/26 16:12:51 | at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223) 27 | INFO | jvm 1 | 2019/07/26 16:12:51 | at com.actiontech.dble.net.NIOAcceptor.(NIOAcceptor.java:46) 28 | ``` 29 | 30 | ## Resolution 31 | 32 | - 根据Error1: 33 | 修改配置文件wrapper.conf:修改被占用端口1984 34 | -Dcom.sun.management.jmxremote.port=1984 35 | - 根据Error2: 36 | netstat -nap 查看程序运行的pid(8066和9066依然存在) 37 | kill -9 pid 杀掉进程 38 | - 启动dble成功 39 | 40 | ## Root Cause 41 | 42 | - 已经启动过一个开启jmx服务的java程序后,再启动dble会报这个错; 43 | - dble启动过程中会占用三个端口:业务端口,管理端口,jvm对外提供jmx服务端口; 44 | - jmx可通过jconsole连接上jvm,观测jvm的运行状态。 45 | 46 | ## Relevant Content 47 | 48 | 1. JVM 49 | JVM是一种使用软件模拟出来的计算机,它用于执行Java程序,有一套非常严格的技术规范,是Java跨平台的依赖基础。 50 | Java虚拟机有自己想象中的硬件,如处理器,堆栈,寄存器等,还有相应的指令系统它允许Java程序就好像一台计算机允许c或c++程序一样。 51 | 52 | 2. JMX 53 | 所谓JMX,是Java Management Extensions的缩写,是Java管理系统的一个标准、一个规范,也是一个接口,一个框架。 54 | 它和JPA、JMS是一样的,就是通过将监控和管理涉及到的各个方面的问题和解决办法放到一起,统一设计,以便向外提供服务,以供使用者调用。 55 | 56 | 3. Jconsole 57 | Jconsole是JDK自带的监控工具,它用于连接正在运行的本地或者远程的JVM,对运行在java应用程序的资源消耗和性能进行监控,并画出大量的图表,提供强大的可视化界面。 58 | 自身占用的服务器内存很小,甚至可以说几乎不消耗。 59 | -------------------------------------------------------------------------------- /A.Faq/ErrorCode/Content/ShardingColumnCannotBeNull.md: -------------------------------------------------------------------------------- 1 | # dble-Sharding column can't be null 2 | 3 | ## Setting 4 | 5 | - sharding.xml部分配置如下: 6 | 7 | ```xml 8 | 9 | ... 10 | 11 | partition.txt 12 | 0 13 | 14 | ``` 15 | - create table account (id int(10),number int(10) not null,name varchar(20) not null); 16 | - insert into account (id,number,name) values (1,NULL,'aaa'); 17 | 18 | ## Issue 19 | 20 | ERROR 1064 (HY000): Sharding column can't be null when the table in MySQL column is not null 21 | 22 | ## Resolution 23 | 24 | - number列和name列的插入值不为NULL; 25 | - 或者修改number列为允许插入NULL值; 26 | ALTER TABLE `account` MODIFY `number` VARCHAR (20); 27 | - **注意**:上一步的前提是: 28 | 在blacklist中开启参数alterTableAllow; 29 | 30 | ```xml 31 | 32 | true 33 | 34 | ``` 35 | 36 | 并修改sharding-by-range中的拆分列,dble不允许对分片键或ER键进行alter,会造成无法分片; 37 | 38 | ```xml 39 | 40 | ``` 41 | 42 | - alter列值为允许插入空值后,再将拆分列修改为原值。 43 | 44 | 45 | ## Root Cause 46 | 47 | 1. 在MySQL中执行相同insert: 48 | 报错:ERROR 1048 (23000): Column 'number' cannot be null 49 | 2. desc查看表结构:number列和name列均定义为非空列,不允许插入空值。 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 |
FieldTypeNullKeyDefaultExtra
idint(10)YESNULL
numberint(10)NONULL
namevarchar(20)NONULL
90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /A.Faq/ErrorCode/Content/TheProblemOfHint.md: -------------------------------------------------------------------------------- 1 | # dble-TheProblemOfHint 2 | 3 | ## Setting 4 | 5 | - mysql> /*#dble:sql=select 1 from rp_cre_data_mobile_track_cmcc */ call update_track(); 6 | - 预期:表为分片表,sql语句应该下发到所有节点 7 | - 结果:只有一个节点在执行 8 | 9 | ## Issue 10 | 11 | - mysql> show @@processlist; 12 | 13 | | Front_Id | shardingNode | BconnID | user | Front_Host | db | Command | Time | State | Info | 14 | | ---- | ---- | ---- | ----| ---- | ----| ---- | ----|---- | ----| 15 | | 33 | NULL | NULL | root | 略 | NULL | NULL | 0 | updating | NULL | 16 | | 34 | NULL | NULL | root | 略 | NULL | NULL | 0 | updating | NULL | 17 | | 35 | NULL | NULL | root | 略 | NULL | NULL | 0 | updating | NULL | 18 | | 41 | dn9 | 9372 | root | 略 | db9 | Query | 0 | updating | NULL | 19 | | 42 | NULL | NULL | root | 略 | NULL | NULL | 0 | updating | NULL | 20 | | 43 | NULL | NULL | root | 略 | NULL | NULL | 0 | updating | NULL | 21 | | 30 | NULL | NULL | admin | 略 | NULL | NULL | 0 | updating | NULL | 22 | 23 | ## Resolution 24 | 25 | 1. 将注解方式: /*#dble:type=....*/ 26 | 改为: /*!dble:type=....*/ 27 | 2. 或者在mysql client端,加上 -c 选项 28 | 29 | >**注意**:mysql --help 30 | >-c, --comments 31 | >Preserve comments. Send comments to the server. The default is --skip-comments (discard comments), enable with --comments. 32 | 33 | ## Root Cause 34 | 35 | 1. /*#dble:type=....*/ 这种注释方式是mysql的标准注释 36 | 2. 如果不加 -c 选项,默认注释会被skip 37 | 38 | ## Relevant Content 39 | 40 | **hint作用** 41 | 42 | 1. 指定路由,比如强制读写分离。 43 | 2. 帮助dble支持一些不能实现的语句,如单节点内存储过程的创建和调用,如insert…select…; 44 | 45 | **Hint语法** 46 | 47 | Hint语法有三种形式: 48 | 1. /\*!dble:type=....*/ 49 | 2. /\*#dble:type=...*/ 50 | 3. /\* */(只适用于读写分离功能) 51 | 52 | type有4种值可选:shardingNode,db_type,sql,db_instance_url。 53 | type详情请见: https://actiontech.github.io/dble-docs-cn/2.Function/2.04_hint.html 54 | 55 | **Hint注意事项** 56 | 57 | - 使用select语句作为注解SQL,不要使用delete/update/insert 等语句。delete/update/insert 等语句虽然也能用在注解中,但这些语句在SQL处理中有一些额外的逻辑判断,会降低性能,不建议使用 58 | - 注解SQL 禁用表关联语句 59 | - 使用hint做DDL需要额外执行reload @@metadata 60 | - 使用hint做session级别的系统变量和环境变量可能不会生效,请慎用 61 | - dble的注解和MySQL原生注解含义不同, 想通过MySQL原生注解来设置变量或者指定索引是无法得到预期结果的。如#1169 62 | - 使用注解并不额外增加的执行时间;从解析复杂度以及性能考虑,注解SQL应尽量用最简单的SQL 语句,如select id from tab_a where id=’10000’; 63 | - 能不用注解也能够解决的场景,尽量不用注解 64 | -------------------------------------------------------------------------------- /A.Faq/Internals/A_overview2.md: -------------------------------------------------------------------------------- 1 | * [How To Use Explain To Resolve The Distribution Rules Of Group Gy](Content/UseExplainToTraceGroupBy.md) 2 | * [Hash And ConsistentHashing And Jumpstringhash](Content/HashAndConsistentHashingAndJumpstringhash.md) 3 | 4 | -------------------------------------------------------------------------------- /A.Faq/Internals/Content/UseExplainToTraceGroupBy.md: -------------------------------------------------------------------------------- 1 | # dble-How To Use Explain To Resolve The Distribution Rules Of Group Gy 2 | 3 | ## Questions 4 | 5 | 一张数据表做了分表。 6 | 如果查询里有group by分组统计,运行原理是按范围去各分表查询出数据后,再到中间件里进行分组统计的吗? 7 | 8 | ## Conclusions 9 | 10 | - 会在中间件中做数据重聚合 11 | 1. 利用explain工具查看sql的执行过程 12 | 2. dble 在explain上做了大量改善,相比mycat能提供更详实的执行计划,更准确的反映SQL语句的执行过程 13 | 14 | ## For Example 15 | 16 | 1. 配置好配置文件: 17 | 18 | sharding.xml: 19 | ```xml 20 | 21 | ... 22 | 23 | 2 24 | 128 25 | 26 | 27 | ``` 28 | 29 | 30 | 2. 在dble client创建表 eee 并插入数据: 31 | mysql> select * from eee; 32 | 33 | | id | name | 34 | | -- | -- | 35 | | 1 | 上海 | 36 | | 2 | 广州 | 37 | | 3 | 杭州 | 38 | | 4 | 北京 | 39 | | 5 | 北京 | 40 | | 130 | 北京 | 41 | | 131 | 北京 | 42 | | 132 | 上海 | 43 | | 133 | 上海 | 44 | | 134 | 上海 | 45 | 46 | mysql> select name,count(name) from eee group by name; 47 | 48 | | name | COUNT(name) | 49 | | -- | -- | 50 | | 上海 | 4 | 51 | | 北京 | 4 | 52 | | 广州 | 1 | 53 | | 杭州 | 1 | 54 | 55 | 3. 利用explain工具查看sql的执行过程 56 | 57 | | SHARDING_NODE | TYPE | SQL/REF | 58 | | -- | -- | -- | 59 | | dn1_0 | BASE SQL| select `eee`.`name`,COUNT(name) as `_$COUNT$_rpda_0` from `eee` GROUP BY `eee`.`name` ASC | 60 | | dn2_0 | BASE SQL| select `eee`.`name`,COUNT(name) as `_$COUNT$_rpda_0` from `eee` GROUP BY `eee`.`name` ASC | 61 | | merge_1 | MERGE| dn1_0; dn2_0 | 62 | | aggregate_1| AGGREGATE| merge_1 | 63 | | shuffle_field_1| SHUFFLE_FIELD| aggregate_1 | 64 | 65 | ## Instructions 66 | 67 | 由explain的结果可知: 68 | 1. dble将sql语句下发到对应shardingnode执行 69 | 2. 将对应shardingnode数据结果进行merge 70 | 3. 对merge后的数据进行group by聚合 71 | 4. SHUFFLE_FIELD进行整理,达到用户预期的结果 72 | > **注意**:普通用户可以不关注SHUFFLE_FIELD 73 | 74 | ## Relevant Content 75 | 76 | **dble的内部功能层** 77 | 78 | 1. 在dble内部,包括了三个部分:面向app的连接层,内部功能层,面向myslq的连接池。 79 | 2. 内部功能层实现:前端请求接收,处理过后由后端协议层发出,将数据返回给用户。 80 | 81 | 内部功能涉及到了简单查询和复杂查询: 82 | - 简单查询:直接下发单个/多个节点 83 | - 复杂查询:dble内部需要进行排序、聚合、join、group by,结果集计算 84 | - 详细介绍:[https://opensource.actionsky.com/dble-lesson-one/](https://opensource.actionsky.com/dble-lesson-one/) 85 | 86 | **dble内部各线程池简介** 87 | 88 | 1. 后端IO接收线程 89 | 处理来自MySQL连接的网络包(sql的执行结果、查询的结果集)。 90 | 91 | 2. 后端业务处理线程 92 | 简单查询的后端MySQL返回处理,并将结果转发反馈给客户端。 93 | 94 | 3. 复杂查询处理线程 95 | 处理复杂查询MySQL返回结果,包括结果集的聚合,对比,排序,去重,子查询语句下发等。 96 | > PS:dble中仅此线程池不限线程数量 97 | -------------------------------------------------------------------------------- /A.Faq/Usage/A_overview3.md: -------------------------------------------------------------------------------- 1 | * [ToBeContinued2](Content/ToBeContinued2.md) 2 | -------------------------------------------------------------------------------- /A.Faq/Usage/Content/ToBeContinued2.md: -------------------------------------------------------------------------------- 1 | 待更新 2 | -------------------------------------------------------------------------------- /Gitbook_README.md: -------------------------------------------------------------------------------- 1 | # 如何更新文档 2 | 3 | 1. 更新文档 4 | 2. 执行 `make gitbook_preview` 可预览修改 5 | 3. 在master分支提交修改 6 | 4. `git status` 确认没有未提交文件 7 | 5. 执行`make`, 将文档编译成静态文件, 部署到`gh-pages`, 并push到github上 -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | default: pull_code gitbook_install gitbook_build gitbook_pdf 2 | 3 | gitbook_preview: 4 | docker run --rm -v "${PWD}":/gitbook -p 4000:4000 billryan/gitbook:zh-hans gitbook serve 5 | gitbook_install: 6 | docker run --rm -v "${PWD}":/gitbook -p 4000:4000 billryan/gitbook:zh-hans gitbook install 7 | gitbook_build: 8 | docker run --rm -v "${PWD}":/gitbook -p 4000:4000 billryan/gitbook:zh-hans gitbook build 9 | pull_code: 10 | git pull origin master --rebase 11 | gitbook_pdf: 12 | docker run --rm -v "${PWD}":/gitbook -p 4000:4000 billryan/gitbook:zh-hans gitbook pdf ./ ./dble-manual.pdf 13 | 14 | 15 | -------------------------------------------------------------------------------- /QR_code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actiontech/dble-docs-cn/e8f6de708f487efb86b3fe86376f00be7c812ae4/QR_code.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # dble 中文技术参考手册 2 | 3 | ## 注意 4 | 本分支上的手册适用于3.23.08.x版dble,其他版本的文档请参考对应tag分支或者release版文档。 5 | 6 | ## 目录 7 | 参考 [gitbook](https://actiontech.github.io/dble-docs-cn) 左侧目录区 或 [SUMMARY.md](https://github.com/actiontech/dble-docs-cn/blob/master/SUMMARY.md) 8 | 9 | 10 | ## 软件包下载 11 | [下载](https://github.com/actiontech/dble/releases) 或者[github镜像站下载](https://hub.fastgit.org/actiontech/dble/releases) 12 | 13 | 14 | ## 文档PDF下载 15 | 16 | [本版本最新版本](dble-manual.pdf) 或者[Release版本](https://github.com/actiontech/dble-docs-cn/releases/download/3.23.08.0%2Ftag/dble-manual-3.23.08.0.pdf) 17 | 18 | 注意:如版本尚未发布,则不能下载 19 | 20 | 21 | 22 | ## 中文公开课 23 | [dble中文公开课](https://opensource.actionsky.com/dble-lessons/) 24 | 25 | 26 | ## 官方技术支持: 27 | - 代码库 github: [github.com/actiontech/dble](https://github.com/actiontech/dble) 28 | - 自动化测试库 github: [github.com/actiontech/dble-test-suite](https://github.com/actiontech/dble-test-suite) 29 | - 文档库 github: [github.com/actiontech/dble-docs-cn](https://github.com/actiontech/dble-docs-cn) 30 | - 文档库 github pages: [actiontech.github.io/dble-docs-cn](https://actiontech.github.io/dble-docs-cn) 31 | - 网站:[DBLE官方网站](https://opensource.actionsky.com) 32 | - QQ group: 669663113 33 | - 开源社区微信公众号 34 | 35 | ![QR_code](./QR_code.png) 36 | 37 | 38 | 39 | ## 提示 40 | [如果您使用了dble,请告诉我们。](https://wj.qq.com/s/2291106/09f4) 41 | 42 | ## 联系我们 43 | 如果想获得dble 的商业支持, 您可以联系我们: 44 | * 全国支持: 400-820-6580 45 | * 华北地区: 86-13910506562, 汪先生 46 | * 华南地区: 86-18503063188, 曹先生 47 | * 华东地区: 86-18930110869, 梁先生 48 | * 西南地区: 86-13540040119, 洪先生 49 | -------------------------------------------------------------------------------- /book.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": ["expandable-chapters", "splitter", "back-to-top-button","github","popup","versions-select"], 3 | "pluginsConfig": { 4 | "fontsettings": { 5 | "theme": "sepia", 6 | "family": "sans", 7 | "size": 2 8 | }, 9 | "versions": { 10 | "gitbookConfigURL": "https://raw.githubusercontent.com/actiontech/dble-docs-cn/master/book.json", 11 | "options": [ 12 | { 13 | "value": "https://actiontech.github.io/dble-docs-cn/", 14 | "text": "Version 3.23.08" 15 | }, 16 | { 17 | "value": "https://actiontech.github.io/dble-docs-cn/history/develop/", 18 | "text": "Version develop" 19 | }, 20 | { 21 | "value": "https://actiontech.github.io/dble-docs-cn/history/3.23.04.doc/", 22 | "text": "Version 3.23.04" 23 | }, 24 | { 25 | "value": "https://actiontech.github.io/dble-docs-cn/history/3.22.11.doc/", 26 | "text": "Version 3.22.11" 27 | }, 28 | { 29 | "value": "https://actiontech.github.io/dble-docs-cn/history/3.22.07.doc/", 30 | "text": "Version 3.22.07" 31 | }, 32 | { 33 | "value": "https://actiontech.github.io/dble-docs-cn/history/3.22.01.doc/", 34 | "text": "Version 3.22.01" 35 | }, 36 | { 37 | "value": "https://actiontech.github.io/dble-docs-cn/history/3.21.10.doc/", 38 | "text": "Version 3.21.10" 39 | }, 40 | { 41 | "value": "https://actiontech.github.io/dble-docs-cn/history/3.21.06.doc/", 42 | "text": "Version 3.21.06" 43 | }, 44 | { 45 | "value": "https://actiontech.github.io/dble-docs-cn/history/3.21.02.doc/", 46 | "text": "Version 3.21.02" 47 | }, 48 | { 49 | "value": "https://actiontech.github.io/dble-docs-cn/history/3.20.10.doc/", 50 | "text": "Version 3.20.10" 51 | }, 52 | { 53 | "value": "https://actiontech.github.io/dble-docs-cn/history/3.20.07.doc/", 54 | "text": "Version 3.20.07" 55 | }, 56 | { 57 | "value": "https://actiontech.github.io/dble-docs-cn/history/2.20.04.doc/", 58 | "text": "Version 2.20.04" 59 | }, 60 | { 61 | "value": "https://actiontech.github.io/dble-docs-cn/history/2.19.11.doc/", 62 | "text": "Version 2.19.11" 63 | }, 64 | { 65 | "value": "https://actiontech.github.io/dble-docs-cn/history/2.19.09.doc/", 66 | "text": "Version 2.19.09" 67 | }, 68 | { 69 | "value": "https://actiontech.github.io/dble-docs-cn/history/2.19.07.doc/", 70 | "text": "Version 2.19.07" 71 | }, 72 | { 73 | "value": "https://actiontech.github.io/dble-docs-cn/history/2.19.05.doc/", 74 | "text": "Version 2.19.05" 75 | }, 76 | { 77 | "value": "https://actiontech.github.io/dble-docs-cn/history/2.19.03.doc/", 78 | "text": "Version 2.19.03" 79 | } 80 | ] 81 | }, 82 | "github":{ 83 | "url":"https://github.com/actiontech/dble" 84 | }, 85 | "plugins": [ 86 | "yahei", 87 | "katex", 88 | "-search" 89 | ] 90 | }, 91 | "styles": { 92 | "website": "website.css", 93 | "pdf": "pdf.css" 94 | }, 95 | "author": "ActionTech", 96 | "title": "dble manual", 97 | "pdf":{ 98 | "paperSize":"a3" 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /pdf.css: -------------------------------------------------------------------------------- 1 | table{ 2 | table-layout: fixed; 3 | width: 100%; 4 | } 5 | -------------------------------------------------------------------------------- /website.css: -------------------------------------------------------------------------------- 1 | /* fix https://github.com/GitbookIO/gitbook/issues/1626 */ 2 | .markdown-section table { 3 | table-layout: fixed; 4 | display:block; 5 | overflow-x: auto; 6 | } 7 | --------------------------------------------------------------------------------