"use strict";(self.webpackChunkdoris_website=self.webpackChunkdoris_website||[]).push([[42516],{15680:(e,t,a)=>{a.d(t,{xA:()=>c,yg:()=>d});var n=a(296540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function s(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},l=Object.keys(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var i=n.createContext({}),p=function(e){var t=n.useContext(i),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},c=function(e){var t=p(e.components);return n.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},y=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,i=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),u=p(a),y=r,d=u["".concat(i,".").concat(y)]||u[y]||m[y]||l;return a?n.createElement(d,s(s({ref:t},c),{},{components:a})):n.createElement(d,s({ref:t},c))}));function d(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,s=new Array(l);s[0]=y;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[u]="string"==typeof e?e:r,s[1]=o;for(var p=2;p<l;p++)s[p]=a[p];return n.createElement.apply(null,s)}return n.createElement.apply(null,a)}y.displayName="MDXCreateElement"},425378:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>m,frontMatter:()=>l,metadata:()=>o,toc:()=>p});var n=a(58168),r=(a(296540),a(15680));const l={title:"ADMIN-SET-TABLE-STATUS",language:"zh-CN"},s=void 0,o={unversionedId:"sql-manual/sql-statements/Database-Administration-Statements/ADMIN-SET-TABLE-STATUS",id:"sql-manual/sql-statements/Database-Administration-Statements/ADMIN-SET-TABLE-STATUS",title:"ADMIN-SET-TABLE-STATUS",description:"\x3c!--",source:"@site/docs/sql-manual/sql-statements/Database-Administration-Statements/ADMIN-SET-TABLE-STATUS.md",sourceDirName:"sql-manual/sql-statements/Database-Administration-Statements",slug:"/sql-manual/sql-statements/Database-Administration-Statements/ADMIN-SET-TABLE-STATUS",permalink:"/docs/dev/sql-manual/sql-statements/Database-Administration-Statements/ADMIN-SET-TABLE-STATUS",draft:!1,tags:[],version:"current",frontMatter:{title:"ADMIN-SET-TABLE-STATUS",language:"zh-CN"},sidebar:"docs",previous:{title:"ADMIN-SET-PARTITION-VERSION",permalink:"/docs/dev/sql-manual/sql-statements/Database-Administration-Statements/ADMIN-SET-PARTITION-VERSION"},next:{title:"SHOW-REPLICA-DISTRIBUTION",permalink:"/docs/dev/sql-manual/sql-statements/Database-Administration-Statements/SHOW-REPLICA-DISTRIBUTION"}},i={},p=[{value:"ADMIN-SET-TABLE-STATUS",id:"admin-set-table-status",level:2},{value:"Name",id:"name",level:3},{value:"Description",id:"description",level:3},{value:"Example",id:"example",level:3},{value:"Keywords",id:"keywords",level:3},{value:"Best Practice",id:"best-practice",level:3}],c={toc:p},u="wrapper";function m(e){let{components:t,...a}=e;return(0,r.yg)(u,(0,n.A)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h2",{id:"admin-set-table-status"},"ADMIN-SET-TABLE-STATUS"),(0,r.yg)("h3",{id:"name"},"Name"),(0,r.yg)("p",null,"ADMIN SET TABLE STATUS"),(0,r.yg)("h3",{id:"description"},"Description"),(0,r.yg)("p",null,"This statement is used to set the state of the specified table. Only supports OLAP tables."),(0,r.yg)("p",null,"This command is currently only used to manually set the OLAP table state to the specified state, allowing some jobs that are stuck by the table state to continue running."),(0,r.yg)("p",null,"grammar:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-sql"},'ADMIN SET TABLE table_name STATUS\n        PROPERTIES ("key" = "value", ...);\n')),(0,r.yg)("p",null,"The following properties are currently supported:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},'"state"\uff1aRequired. Specifying a target state then the state of the OLAP table will change to this state.')),(0,r.yg)("blockquote",null,(0,r.yg)("p",{parentName:"blockquote"},"The current target states include:"),(0,r.yg)("ol",{parentName:"blockquote"},(0,r.yg)("li",{parentName:"ol"},"NORMAL"),(0,r.yg)("li",{parentName:"ol"},"ROLLUP"),(0,r.yg)("li",{parentName:"ol"},"SCHEMA_CHANGE"),(0,r.yg)("li",{parentName:"ol"},"BACKUP"),(0,r.yg)("li",{parentName:"ol"},"RESTORE"),(0,r.yg)("li",{parentName:"ol"},"WAITING_STABLE")),(0,r.yg)("p",{parentName:"blockquote"},"If the current state of the table is already the specified state, it will be ignored.")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Note: This command is generally only used for emergency fault repair, please proceed with caution.")),(0,r.yg)("h3",{id:"example"},"Example"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"Set the state of table tbl1 to NORMAL.")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-sql"},'admin set table tbl1 status properties("state" = "NORMAL");\n')),(0,r.yg)("ol",{start:2},(0,r.yg)("li",{parentName:"ol"},"Set the state of table tbl2 to SCHEMA_CHANGE")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-sql"},'admin set table test_set_table_status status properties("state" = "SCHEMA_CHANGE");\n')),(0,r.yg)("h3",{id:"keywords"},"Keywords"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"ADMIN, SET, TABLE, STATUS\n")),(0,r.yg)("h3",{id:"best-practice"},"Best Practice"))}m.isMDXComponent=!0}}]);