[{"data":1,"prerenderedAt":2560},["ShallowReactive",2],{"\u002Fget\u002Fhosted\u002Fupgrade-navigation":3,"\u002Fget\u002Fhosted\u002Fupgrade":411},[4,8,12,16,20,24,28,32,76,110,142,170,204,231,269,299,329,356,383],{"title":5,"path":6,"stem":7},"Get started","\u002Fget","get\u002F01.index",{"title":9,"path":10,"stem":11},"Logs monitoring","\u002Fget\u002Flogs","get\u002F02.logs",{"title":13,"path":14,"stem":15},"Exceptions and errors","\u002Fget\u002Fexceptions","get\u002F03.exceptions",{"title":17,"path":18,"stem":19},"Kubernetes","\u002Fget\u002Fkubernetes","get\u002F04.kubernetes",{"title":21,"path":22,"stem":23},"Migrating from Datadog","\u002Fget\u002Fdatadog-migration","get\u002F05.datadog-migration",{"title":25,"path":26,"stem":27},"Migrating from NewRelic","\u002Fget\u002Fnewrelic-migration","get\u002F06.newrelic-migration",{"title":29,"path":30,"stem":31},"Synthetic Monitoring","\u002Fget\u002Fsynthetic-monitoring","get\u002F07.synthetic-monitoring",{"title":33,"closed":34,"path":35,"stem":36,"children":37,"page":-1},"Hosted",true,"\u002Fget\u002Fhosted","get\u002Fhosted\u002Findex",[38,40,44,48,52,56,60,64,68,72],{"title":39,"path":35,"stem":36},"Overview",{"title":41,"path":42,"stem":43},"Why Uptrace?","\u002Fget\u002Fhosted\u002Fopen-source-apm","get\u002Fhosted\u002F01.open-source-apm",{"title":45,"path":46,"stem":47},"Install Uptrace","\u002Fget\u002Fhosted\u002Finstall","get\u002Fhosted\u002F02.install",{"title":49,"path":50,"stem":51},"Ansible deployment","\u002Fget\u002Fhosted\u002Fansible","get\u002Fhosted\u002F03.ansible",{"title":53,"path":54,"stem":55},"K8s deployment","\u002Fget\u002Fhosted\u002Fk8s","get\u002Fhosted\u002F04.k8s",{"title":57,"path":58,"stem":59},"Docker deployment","\u002Fget\u002Fhosted\u002Fdocker","get\u002Fhosted\u002F05.docker",{"title":61,"path":62,"stem":63},"Configuration","\u002Fget\u002Fhosted\u002Fconfig","get\u002Fhosted\u002F06.config",{"title":65,"path":66,"stem":67},"Upgrading","\u002Fget\u002Fhosted\u002Fupgrade","get\u002Fhosted\u002F07.upgrade",{"title":69,"path":70,"stem":71},"Troubleshooting","\u002Fget\u002Fhosted\u002Fdebug","get\u002Fhosted\u002F08.debug",{"title":73,"path":74,"stem":75},"Scaling","\u002Fget\u002Fhosted\u002Fscale","get\u002Fhosted\u002F09.scale",{"title":77,"path":78,"stem":79,"children":80,"closed":34},"C++","\u002Fget\u002Fopentelemetry-cpp","get\u002Fopentelemetry-cpp\u002F01.index",[81,82,86,90,94,98,102,106],{"title":5,"path":78,"stem":79},{"title":83,"path":84,"stem":85},"OTLP exporter","\u002Fget\u002Fopentelemetry-cpp\u002Fotlp","get\u002Fopentelemetry-cpp\u002F02.otlp",{"title":87,"path":88,"stem":89},"Tracing","\u002Fget\u002Fopentelemetry-cpp\u002Ftracing","get\u002Fopentelemetry-cpp\u002F03.tracing",{"title":91,"path":92,"stem":93},"Metrics","\u002Fget\u002Fopentelemetry-cpp\u002Fmetrics","get\u002Fopentelemetry-cpp\u002F04.metrics",{"title":95,"path":96,"stem":97},"Logs","\u002Fget\u002Fopentelemetry-cpp\u002Flogs","get\u002Fopentelemetry-cpp\u002F05.logs",{"title":99,"path":100,"stem":101},"Resource attributes","\u002Fget\u002Fopentelemetry-cpp\u002Fresources","get\u002Fopentelemetry-cpp\u002F06.resources",{"title":103,"path":104,"stem":105},"Context Propagation","\u002Fget\u002Fopentelemetry-cpp\u002Fpropagation","get\u002Fopentelemetry-cpp\u002F07.propagation",{"title":107,"path":108,"stem":109},"Sampling","\u002Fget\u002Fopentelemetry-cpp\u002Fsampling","get\u002Fopentelemetry-cpp\u002F08.sampling",{"title":111,"path":112,"stem":113,"children":114,"closed":34},".NET","\u002Fget\u002Fopentelemetry-dotnet","get\u002Fopentelemetry-dotnet\u002F01.index",[115,116,119,122,125,128,132,135,138],{"title":5,"path":112,"stem":113},{"title":83,"path":117,"stem":118},"\u002Fget\u002Fopentelemetry-dotnet\u002Fotlp","get\u002Fopentelemetry-dotnet\u002F02.otlp",{"title":87,"path":120,"stem":121},"\u002Fget\u002Fopentelemetry-dotnet\u002Ftracing","get\u002Fopentelemetry-dotnet\u002F03.tracing",{"title":91,"path":123,"stem":124},"\u002Fget\u002Fopentelemetry-dotnet\u002Fmetrics","get\u002Fopentelemetry-dotnet\u002F04.metrics",{"title":95,"path":126,"stem":127},"\u002Fget\u002Fopentelemetry-dotnet\u002Flogs","get\u002Fopentelemetry-dotnet\u002F05.logs",{"title":129,"path":130,"stem":131},"Resource detectors","\u002Fget\u002Fopentelemetry-dotnet\u002Fresources","get\u002Fopentelemetry-dotnet\u002F06.resources",{"title":103,"path":133,"stem":134},"\u002Fget\u002Fopentelemetry-dotnet\u002Fpropagation","get\u002Fopentelemetry-dotnet\u002F07.propagation",{"title":107,"path":136,"stem":137},"\u002Fget\u002Fopentelemetry-dotnet\u002Fsampling","get\u002Fopentelemetry-dotnet\u002F08.sampling",{"title":139,"path":140,"stem":141},"Zero-code","\u002Fget\u002Fopentelemetry-dotnet\u002Fzero-code","get\u002Fopentelemetry-dotnet\u002F09.zero-code",{"title":143,"path":144,"stem":145,"children":146,"closed":34},"Erlang\u002FElixir","\u002Fget\u002Fopentelemetry-erlang","get\u002Fopentelemetry-erlang\u002F01.index",[147,148,151,154,157,160,163,167],{"title":5,"path":144,"stem":145},{"title":83,"path":149,"stem":150},"\u002Fget\u002Fopentelemetry-erlang\u002Fotlp","get\u002Fopentelemetry-erlang\u002F02.otlp",{"title":87,"path":152,"stem":153},"\u002Fget\u002Fopentelemetry-erlang\u002Ftracing","get\u002Fopentelemetry-erlang\u002F03.tracing",{"title":91,"path":155,"stem":156},"\u002Fget\u002Fopentelemetry-erlang\u002Fmetrics","get\u002Fopentelemetry-erlang\u002F04.metrics",{"title":95,"path":158,"stem":159},"\u002Fget\u002Fopentelemetry-erlang\u002Flogs","get\u002Fopentelemetry-erlang\u002F05.logs",{"title":129,"path":161,"stem":162},"\u002Fget\u002Fopentelemetry-erlang\u002Fresources","get\u002Fopentelemetry-erlang\u002F06.resources",{"title":164,"path":165,"stem":166},"Propagation","\u002Fget\u002Fopentelemetry-erlang\u002Fpropagation","get\u002Fopentelemetry-erlang\u002F07.propagation",{"title":107,"path":168,"stem":169},"\u002Fget\u002Fopentelemetry-erlang\u002Fsampling","get\u002Fopentelemetry-erlang\u002F08.sampling",{"title":171,"path":172,"stem":173,"children":174,"closed":34},"Golang","\u002Fget\u002Fopentelemetry-go","get\u002Fopentelemetry-go\u002F01.index",[175,176,179,182,185,188,191,194,197,201],{"title":5,"path":172,"stem":173},{"title":83,"path":177,"stem":178},"\u002Fget\u002Fopentelemetry-go\u002Fotlp","get\u002Fopentelemetry-go\u002F02.otlp",{"title":87,"path":180,"stem":181},"\u002Fget\u002Fopentelemetry-go\u002Ftracing","get\u002Fopentelemetry-go\u002F03.tracing",{"title":91,"path":183,"stem":184},"\u002Fget\u002Fopentelemetry-go\u002Fmetrics","get\u002Fopentelemetry-go\u002F04.metrics",{"title":95,"path":186,"stem":187},"\u002Fget\u002Fopentelemetry-go\u002Flogs","get\u002Fopentelemetry-go\u002F05.logs",{"title":129,"path":189,"stem":190},"\u002Fget\u002Fopentelemetry-go\u002Fresources","get\u002Fopentelemetry-go\u002F06.resources",{"title":103,"path":192,"stem":193},"\u002Fget\u002Fopentelemetry-go\u002Fpropagation","get\u002Fopentelemetry-go\u002F07.propagation",{"title":107,"path":195,"stem":196},"\u002Fget\u002Fopentelemetry-go\u002Fsampling","get\u002Fopentelemetry-go\u002F08.sampling",{"title":198,"path":199,"stem":200},"Serverless","\u002Fget\u002Fopentelemetry-go\u002Fserverless","get\u002Fopentelemetry-go\u002F09.serverless",{"title":139,"path":202,"stem":203},"\u002Fget\u002Fopentelemetry-go\u002Fzero-code","get\u002Fopentelemetry-go\u002F09.zero-code",{"title":205,"path":206,"stem":207,"children":208,"closed":34},"Java","\u002Fget\u002Fopentelemetry-java","get\u002Fopentelemetry-java\u002F01.index",[209,210,213,216,219,222,225,228],{"title":5,"path":206,"stem":207},{"title":87,"path":211,"stem":212},"\u002Fget\u002Fopentelemetry-java\u002Ftracing","get\u002Fopentelemetry-java\u002F03.tracing",{"title":91,"path":214,"stem":215},"\u002Fget\u002Fopentelemetry-java\u002Fmetrics","get\u002Fopentelemetry-java\u002F04.metrics",{"title":95,"path":217,"stem":218},"\u002Fget\u002Fopentelemetry-java\u002Flogs","get\u002Fopentelemetry-java\u002F05.logs",{"title":129,"path":220,"stem":221},"\u002Fget\u002Fopentelemetry-java\u002Fresources","get\u002Fopentelemetry-java\u002F06.resources",{"title":164,"path":223,"stem":224},"\u002Fget\u002Fopentelemetry-java\u002Fpropagation","get\u002Fopentelemetry-java\u002F07.propagation",{"title":107,"path":226,"stem":227},"\u002Fget\u002Fopentelemetry-java\u002Fsampling","get\u002Fopentelemetry-java\u002F08.sampling",{"title":139,"path":229,"stem":230},"\u002Fget\u002Fopentelemetry-java\u002Fzero-code","get\u002Fopentelemetry-java\u002F09.zero-code",{"title":232,"path":233,"stem":234,"children":235,"closed":34},"JavaScript","\u002Fget\u002Fopentelemetry-js","get\u002Fopentelemetry-js\u002F01.index",[236,237,241,245,248,251,254,257,260,263,266],{"title":5,"path":233,"stem":234},{"title":238,"path":239,"stem":240},"Node.js","\u002Fget\u002Fopentelemetry-js\u002Fnode","get\u002Fopentelemetry-js\u002F02.node",{"title":242,"path":243,"stem":244},"Browsers","\u002Fget\u002Fopentelemetry-js\u002Fbrowser","get\u002Fopentelemetry-js\u002F03.browser",{"title":83,"path":246,"stem":247},"\u002Fget\u002Fopentelemetry-js\u002Fotlp","get\u002Fopentelemetry-js\u002F04.otlp",{"title":87,"path":249,"stem":250},"\u002Fget\u002Fopentelemetry-js\u002Ftracing","get\u002Fopentelemetry-js\u002F05.tracing",{"title":91,"path":252,"stem":253},"\u002Fget\u002Fopentelemetry-js\u002Fmetrics","get\u002Fopentelemetry-js\u002F06.metrics",{"title":95,"path":255,"stem":256},"\u002Fget\u002Fopentelemetry-js\u002Flogs","get\u002Fopentelemetry-js\u002F07.logs",{"title":129,"path":258,"stem":259},"\u002Fget\u002Fopentelemetry-js\u002Fresources","get\u002Fopentelemetry-js\u002F08.resources",{"title":164,"path":261,"stem":262},"\u002Fget\u002Fopentelemetry-js\u002Fpropagation","get\u002Fopentelemetry-js\u002F09.propagation",{"title":107,"path":264,"stem":265},"\u002Fget\u002Fopentelemetry-js\u002Fsampling","get\u002Fopentelemetry-js\u002F10.sampling",{"title":139,"path":267,"stem":268},"\u002Fget\u002Fopentelemetry-js\u002Fzero-code","get\u002Fopentelemetry-js\u002F11.zero-code",{"title":270,"path":271,"stem":272,"children":273,"closed":34},"PHP","\u002Fget\u002Fopentelemetry-php","get\u002Fopentelemetry-php\u002F01.index",[274,275,278,281,284,287,290,293,296],{"title":5,"path":271,"stem":272},{"title":83,"path":276,"stem":277},"\u002Fget\u002Fopentelemetry-php\u002Fotlp","get\u002Fopentelemetry-php\u002F02.otlp",{"title":87,"path":279,"stem":280},"\u002Fget\u002Fopentelemetry-php\u002Ftracing","get\u002Fopentelemetry-php\u002F03.tracing",{"title":91,"path":282,"stem":283},"\u002Fget\u002Fopentelemetry-php\u002Fmetrics","get\u002Fopentelemetry-php\u002F04.metrics",{"title":95,"path":285,"stem":286},"\u002Fget\u002Fopentelemetry-php\u002Flogs","get\u002Fopentelemetry-php\u002F05.logs",{"title":129,"path":288,"stem":289},"\u002Fget\u002Fopentelemetry-php\u002Fresources","get\u002Fopentelemetry-php\u002F06.resources",{"title":164,"path":291,"stem":292},"\u002Fget\u002Fopentelemetry-php\u002Fpropagation","get\u002Fopentelemetry-php\u002F07.propagation",{"title":107,"path":294,"stem":295},"\u002Fget\u002Fopentelemetry-php\u002Fsampling","get\u002Fopentelemetry-php\u002F08.sampling",{"title":139,"path":297,"stem":298},"\u002Fget\u002Fopentelemetry-php\u002Fzero-code","get\u002Fopentelemetry-php\u002F09.zero-code",{"title":300,"path":301,"stem":302,"children":303,"closed":34},"Python","\u002Fget\u002Fopentelemetry-python","get\u002Fopentelemetry-python\u002F01.index",[304,305,308,311,314,317,320,323,326],{"title":5,"path":301,"stem":302},{"title":83,"path":306,"stem":307},"\u002Fget\u002Fopentelemetry-python\u002Fotlp","get\u002Fopentelemetry-python\u002F02.otlp",{"title":87,"path":309,"stem":310},"\u002Fget\u002Fopentelemetry-python\u002Ftracing","get\u002Fopentelemetry-python\u002F03.tracing",{"title":91,"path":312,"stem":313},"\u002Fget\u002Fopentelemetry-python\u002Fmetrics","get\u002Fopentelemetry-python\u002F04.metrics",{"title":95,"path":315,"stem":316},"\u002Fget\u002Fopentelemetry-python\u002Flogs","get\u002Fopentelemetry-python\u002F05.logs",{"title":129,"path":318,"stem":319},"\u002Fget\u002Fopentelemetry-python\u002Fresources","get\u002Fopentelemetry-python\u002F06.resources",{"title":164,"path":321,"stem":322},"\u002Fget\u002Fopentelemetry-python\u002Fpropagation","get\u002Fopentelemetry-python\u002F07.propagation",{"title":107,"path":324,"stem":325},"\u002Fget\u002Fopentelemetry-python\u002Fsampling","get\u002Fopentelemetry-python\u002F08.sampling",{"title":139,"path":327,"stem":328},"\u002Fget\u002Fopentelemetry-python\u002Fzero-code","get\u002Fopentelemetry-python\u002F09.zero-code",{"title":330,"path":331,"stem":332,"children":333,"closed":34},"Ruby","\u002Fget\u002Fopentelemetry-ruby","get\u002Fopentelemetry-ruby\u002F01.index",[334,335,338,341,344,347,350,353],{"title":5,"path":331,"stem":332},{"title":83,"path":336,"stem":337},"\u002Fget\u002Fopentelemetry-ruby\u002Fotlp","get\u002Fopentelemetry-ruby\u002F02.otlp",{"title":87,"path":339,"stem":340},"\u002Fget\u002Fopentelemetry-ruby\u002Ftracing","get\u002Fopentelemetry-ruby\u002F03.tracing",{"title":91,"path":342,"stem":343},"\u002Fget\u002Fopentelemetry-ruby\u002Fmetrics","get\u002Fopentelemetry-ruby\u002F04.metrics",{"title":95,"path":345,"stem":346},"\u002Fget\u002Fopentelemetry-ruby\u002Flogs","get\u002Fopentelemetry-ruby\u002F05.logs",{"title":129,"path":348,"stem":349},"\u002Fget\u002Fopentelemetry-ruby\u002Fresources","get\u002Fopentelemetry-ruby\u002F06.resources",{"title":164,"path":351,"stem":352},"\u002Fget\u002Fopentelemetry-ruby\u002Fpropagation","get\u002Fopentelemetry-ruby\u002F07.propagation",{"title":107,"path":354,"stem":355},"\u002Fget\u002Fopentelemetry-ruby\u002Fsampling","get\u002Fopentelemetry-ruby\u002F08.sampling",{"title":357,"path":358,"stem":359,"children":360,"closed":34},"Rust","\u002Fget\u002Fopentelemetry-rust","get\u002Fopentelemetry-rust\u002F01.index",[361,362,365,368,371,374,377,380],{"title":5,"path":358,"stem":359},{"title":83,"path":363,"stem":364},"\u002Fget\u002Fopentelemetry-rust\u002Fotlp","get\u002Fopentelemetry-rust\u002F02.otlp",{"title":87,"path":366,"stem":367},"\u002Fget\u002Fopentelemetry-rust\u002Ftracing","get\u002Fopentelemetry-rust\u002F03.tracing",{"title":91,"path":369,"stem":370},"\u002Fget\u002Fopentelemetry-rust\u002Fmetrics","get\u002Fopentelemetry-rust\u002F04.metrics",{"title":95,"path":372,"stem":373},"\u002Fget\u002Fopentelemetry-rust\u002Flogs","get\u002Fopentelemetry-rust\u002F05.logs",{"title":129,"path":375,"stem":376},"\u002Fget\u002Fopentelemetry-rust\u002Fresources","get\u002Fopentelemetry-rust\u002F06.resources",{"title":164,"path":378,"stem":379},"\u002Fget\u002Fopentelemetry-rust\u002Fpropagation","get\u002Fopentelemetry-rust\u002F07.propagation",{"title":107,"path":381,"stem":382},"\u002Fget\u002Fopentelemetry-rust\u002Fsampling","get\u002Fopentelemetry-rust\u002F08.sampling",{"title":384,"path":385,"stem":386,"children":387,"closed":34},"Swift","\u002Fget\u002Fopentelemetry-swift","get\u002Fopentelemetry-swift\u002F01.index",[388,389,392,395,398,401,405,408],{"title":5,"path":385,"stem":386},{"title":83,"path":390,"stem":391},"\u002Fget\u002Fopentelemetry-swift\u002Fotlp","get\u002Fopentelemetry-swift\u002F02.otlp",{"title":87,"path":393,"stem":394},"\u002Fget\u002Fopentelemetry-swift\u002Ftracing","get\u002Fopentelemetry-swift\u002F03.tracing",{"title":91,"path":396,"stem":397},"\u002Fget\u002Fopentelemetry-swift\u002Fmetrics","get\u002Fopentelemetry-swift\u002F04.metrics",{"title":95,"path":399,"stem":400},"\u002Fget\u002Fopentelemetry-swift\u002Flogs","get\u002Fopentelemetry-swift\u002F05.logs",{"title":402,"path":403,"stem":404},"Resource Attributes","\u002Fget\u002Fopentelemetry-swift\u002Fresources","get\u002Fopentelemetry-swift\u002F06.resources",{"title":103,"path":406,"stem":407},"\u002Fget\u002Fopentelemetry-swift\u002Fpropagation","get\u002Fopentelemetry-swift\u002F07.propagation",{"title":107,"path":409,"stem":410},"\u002Fget\u002Fopentelemetry-swift\u002Fsampling","get\u002Fopentelemetry-swift\u002F08.sampling",{"page":412,"surround":2555},{"id":413,"title":414,"author":415,"body":416,"date":2541,"description":2542,"extension":2543,"image":2544,"meta":2545,"navigation":2551,"path":66,"seo":2552,"stem":67,"surround_disabled":2553,"__hash__":2554},"get\u002Fget\u002Fhosted\u002F07.upgrade.md","Upgrading Uptrace","vmihailenco",{"type":417,"value":418,"toc":2520},"minimark",[419,428,431,537,540,545,548,611,614,618,621,684,698,701,709,953,970,976,992,995,999,1002,1008,1046,1051,1055,1058,1061,1075,1081,1087,1102,1108,1122,1125,1167,1171,1174,1199,1202,1279,1291,1297,1302,1316,1416,1427,1430,1438,1460,1466,1470,1480,1556,1572,1590,1594,1604,1610,1628,1639,1642,1649,1653,1659,1671,1677,1684,1701,1704,1719,1723,1728,1734,1737,1789,1793,1811,1820,1845,1849,1856,1876,1888,1891,1909,1913,1922,1928,1931,1945,1955,1958,1974,1978,1981,1984,2000,2011,2017,2022,2072,2077,2133,2144,2150,2157,2166,2178,2182,2310,2313,2516],[420,421,422,423,427],"p",{},"Every Uptrace release can change the PostgreSQL and ClickHouse schemas. The ",[424,425,426],"code",{},"uptrace migrate"," command applies those changes and moves the running processes to the new version, so Uptrace keeps accepting telemetry during the upgrade.",[420,429,430],{},"The short version for a DEB or RPM install:",[432,433,438],"pre",{"className":434,"code":435,"language":436,"meta":437,"style":437},"language-shell shiki shiki-themes github-light","# 1. Back up PostgreSQL and ClickHouse.\n# 2. Install the new package (do not restart the service yet).\n# 3. Rewrite deprecated config options, then check the config.\nuptrace config fix\nuptrace config fix --write\nuptrace config validate\n# 4. Preview the upgrade.\nuptrace migrate up --plan\n# 5. Apply the migrations and restart Uptrace.\nuptrace migrate up --restart\n","shell","",[424,439,440,449,455,461,475,489,499,505,519,525],{"__ignoreMap":437},[441,442,445],"span",{"class":443,"line":444},"line",1,[441,446,448],{"class":447},"sAwPA","# 1. Back up PostgreSQL and ClickHouse.\n",[441,450,452],{"class":443,"line":451},2,[441,453,454],{"class":447},"# 2. Install the new package (do not restart the service yet).\n",[441,456,458],{"class":443,"line":457},3,[441,459,460],{"class":447},"# 3. Rewrite deprecated config options, then check the config.\n",[441,462,464,468,472],{"class":443,"line":463},4,[441,465,467],{"class":466},"s7eDp","uptrace",[441,469,471],{"class":470},"sYBdl"," config",[441,473,474],{"class":470}," fix\n",[441,476,478,480,482,485],{"class":443,"line":477},5,[441,479,467],{"class":466},[441,481,471],{"class":470},[441,483,484],{"class":470}," fix",[441,486,488],{"class":487},"sYu0t"," --write\n",[441,490,492,494,496],{"class":443,"line":491},6,[441,493,467],{"class":466},[441,495,471],{"class":470},[441,497,498],{"class":470}," validate\n",[441,500,502],{"class":443,"line":501},7,[441,503,504],{"class":447},"# 4. Preview the upgrade.\n",[441,506,508,510,513,516],{"class":443,"line":507},8,[441,509,467],{"class":466},[441,511,512],{"class":470}," migrate",[441,514,515],{"class":470}," up",[441,517,518],{"class":487}," --plan\n",[441,520,522],{"class":443,"line":521},9,[441,523,524],{"class":447},"# 5. Apply the migrations and restart Uptrace.\n",[441,526,528,530,532,534],{"class":443,"line":527},10,[441,529,467],{"class":466},[441,531,512],{"class":470},[441,533,515],{"class":470},[441,535,536],{"class":487}," --restart\n",[420,538,539],{},"The rest of this page explains each step, what to do when a step fails, and how to roll back.",[541,542,544],"h2",{"id":543},"supported-upgrade-paths","Supported upgrade paths",[420,546,547],{},"You can upgrade from each of these releases directly to the latest release, in one step. You do not need to install the releases between them:",[549,550,551,564],"table",{},[552,553,554],"thead",{},[555,556,557,561],"tr",{},[558,559,560],"th",{},"You run",[558,562,563],{},"Upgrade",[565,566,567,576,590,598],"tbody",{},[555,568,569,573],{},[570,571,572],"td",{},"v2.1.0 or later",[570,574,575],{},"Follow this page.",[555,577,578,581],{},[570,579,580],{},"v2.0.0-beta.3 to v2.0.3, v2.1.0-beta to v2.1.0-beta.8",[570,582,583,584,589],{},"Read ",[585,586,588],"a",{"href":587},"#upgrading-from-classic","Upgrading from v2.0 or a v2.1 beta"," first, then follow this page.",[555,591,592,595],{},[570,593,594],{},"v2.0.0-beta.1, v2.0.0-beta.2, v2.0.0-rc.2",[570,596,597],{},"Not supported. Install the latest release on new databases.",[555,599,600,603],{},[570,601,602],{},"v1.x",[570,604,605,606,610],{},"Not supported. v2 stores data differently. Run v2 next to v1 as the ",[585,607,609],{"href":608},"\u002Fblog\u002Fuptrace-v20#migration-strategy","v2.0 migration strategy"," describes, then remove v1.",[420,612,613],{},"Every release in the table is tested: its own binary creates the databases, and the latest release then upgrades them.",[541,615,617],{"id":616},"before-you-upgrade","Before you upgrade",[420,619,620],{},"Before you start:",[622,623,624,635,652],"ul",{},[625,626,627,628,634],"li",{},"Read the release notes on ",[585,629,633],{"href":630,"rel":631},"https:\u002F\u002Fgithub.com\u002Fuptrace\u002Fuptrace\u002Freleases",[632],"nofollow","GitHub Releases",".",[625,636,637,638,642,643,646,647,651],{},"Back up both PostgreSQL and ClickHouse. The ",[585,639,641],{"href":640},"\u002Fget\u002Fhosted\u002Fdocker#backup-and-restore","Docker",", ",[585,644,17],{"href":645},"\u002Fget\u002Fhosted\u002Fk8s#back-up-databases",", and ",[585,648,650],{"href":649},"\u002Fget\u002Fhosted\u002Fansible#upgrading-uptrace","Ansible"," guides show how.",[625,653,654,655,667,670,673,674,676,677,683],{},"With the new binary installed, check that it can start against your stores:",[432,656,658],{"className":434,"code":657,"language":436,"meta":437,"style":437},"uptrace preflight\n",[424,659,660],{"__ignoreMap":437},[441,661,662,664],{"class":443,"line":444},[441,663,467],{"class":466},[441,665,666],{"class":470}," preflight\n",[668,669],"br",{},[424,671,672],{},"preflight"," checks that the binary has the license keys of its edition, that PostgreSQL, every ClickHouse replica, and the Kafka brokers (when configured) answer with your credentials, that PostgreSQL and ClickHouse run supported versions, and that no migration stopped partway and no rollback was left unfinished. It exits non-zero when one of these fails. Unapplied migrations are expected at this point, so they only warn. ",[424,675,672],{}," runs a subset of ",[585,678,680],{"href":679},"\u002Fget\u002Fhosted\u002Fdebug#check-the-deployment",[424,681,682],{},"uptrace doctor",", which also checks Redis, the replicas, the disks, and the outbound endpoints.",[420,685,686,687,689,690,693,694,697],{},"All ",[424,688,426],{}," commands read ",[424,691,692],{},"\u002Fetc\u002Fuptrace\u002Fconfig.yml"," by default. Pass ",[424,695,696],{},"--config=\u002Fpath\u002Fto\u002Fconfig.yml"," to use another file.",[541,699,588],{"id":700},"upgrading-from-classic",[420,702,703,704,708],{},"v2.0.x and the v2.1.0 betas are ",[705,706,707],"em",{},"classic releases",": they migrated the databases with other commands and recorded the migrations in other tables. The latest release upgrades their databases, but the first upgrade needs these extra steps.",[710,711,712,723,770,798,883],"ol",{},[625,713,714,718,719,722],{},[715,716,717],"strong",{},"Upgrade the databases."," Uptrace now needs ClickHouse 26.3 or later and PostgreSQL 15 or later. Upgrade the servers before you install the new Uptrace: v2.0.x and the v2.1 betas keep working on ClickHouse 26.3. ",[424,720,721],{},"uptrace preflight"," checks both versions.",[625,724,725,728,729,732,733,736,737,745,747,748,767,769],{},[715,726,727],{},"Set a secret."," The new release refuses to start when ",[424,730,731],{},"service.secret"," is the placeholder ",[424,734,735],{},"FIXME"," that older configs shipped with:",[432,738,743],{"className":739,"code":741,"language":742,"meta":437},[740],"language-text","invalid config: service.secret is the shipped placeholder \"FIXME\"; set a random value\n","text",[424,744,741],{"__ignoreMap":437},[668,746],{},"Set it to a random value:",[432,749,751],{"className":434,"code":750,"language":436,"meta":437,"style":437},"openssl rand -hex 32\n",[424,752,753],{"__ignoreMap":437},[441,754,755,758,761,764],{"class":443,"line":444},[441,756,757],{"class":466},"openssl",[441,759,760],{"class":470}," rand",[441,762,763],{"class":487}," -hex",[441,765,766],{"class":487}," 32\n",[668,768],{},"The secret signs login sessions, so a new secret logs out every user once. The DEB and RPM packages replace the placeholder for you.",[625,771,772,775,776,779,780,783,784,787,788,783,791,787,794,797],{},[715,773,774],{},"Rewrite the config."," Run ",[424,777,778],{},"uptrace config fix --write",". It moves the options that changed place, for example ",[424,781,782],{},"spans"," to ",[424,785,786],{},"pipelines.spans"," and ",[424,789,790],{},"ch_schema.metrics",[424,792,793],{},"ch_schema.timeseries",[424,795,796],{},"ch_schema.datapoints",", and deletes the options that the new release does not use.",[625,799,800,803,804,807,808,878,880,882],{},[715,801,802],{},"Replace the old migration commands"," in your scripts, init containers, and entrypoints. ",[424,805,806],{},"serve"," no longer migrates the databases when it starts, as v2.0 did:",[549,809,810,820],{},[552,811,812],{},[555,813,814,817],{},[558,815,816],{},"Old command",[558,818,819],{},"New command",[565,821,822,837,851,866],{},[555,823,824,832],{},[570,825,826,642,829],{},[424,827,828],{},"uptrace pg init",[424,830,831],{},"uptrace pg migrate",[570,833,834],{},[424,835,836],{},"uptrace migrate up",[555,838,839,847],{},[570,840,841,642,844],{},[424,842,843],{},"uptrace ch init",[424,845,846],{},"uptrace ch migrate",[570,848,849],{},[424,850,836],{},[555,852,853,861],{},[570,854,855,642,858],{},[424,856,857],{},"uptrace ch status",[424,859,860],{},"uptrace ch check",[570,862,863],{},[424,864,865],{},"uptrace migrate status",[555,867,868,873],{},[570,869,870],{},[424,871,872],{},"uptrace sync_dashboards",[570,874,875],{},[424,876,877],{},"uptrace dashboard sync",[668,879],{},[424,881,836],{}," migrates PostgreSQL and ClickHouse together. The old commands print the new command and exit with an error.",[625,884,885,888,889,892,893,895,896,899,900,903,904,908,909,948,950,951,634],{},[715,886,887],{},"Restart the old processes yourself."," A classic process cannot receive the restart request of ",[424,890,891],{},"--restart",". After the expand steps, ",[424,894,836],{}," checks PostgreSQL for the sessions of a classic process. While one is connected, ",[424,897,898],{},"up"," waits up to ",[424,901,902],{},"--wait",", then stops before the backfill, names the sessions, and exits non-zero. The old release keeps serving. Use the ",[585,905,907],{"href":906},"#case-2-manual-restarts","manual restarts"," case for the first upgrade:",[432,910,912],{"className":434,"code":911,"language":436,"meta":437,"style":437},"uptrace migrate up --before-release-change\nsudo systemctl restart uptrace\nuptrace migrate up\n",[424,913,914,925,939],{"__ignoreMap":437},[441,915,916,918,920,922],{"class":443,"line":444},[441,917,467],{"class":466},[441,919,512],{"class":470},[441,921,515],{"class":470},[441,923,924],{"class":487}," --before-release-change\n",[441,926,927,930,933,936],{"class":443,"line":451},[441,928,929],{"class":466},"sudo",[441,931,932],{"class":470}," systemctl",[441,934,935],{"class":470}," restart",[441,937,938],{"class":470}," uptrace\n",[441,940,941,943,945],{"class":443,"line":457},[441,942,467],{"class":466},[441,944,512],{"class":470},[441,946,947],{"class":470}," up\n",[668,949],{},"Later upgrades can use ",[424,952,891],{},[420,954,955,956,959,960,787,963,965,966,969],{},"On the first run, ",[424,957,958],{},"migrate"," reads the records of the classic release and does not run those migrations again. Before that run, ",[424,961,962],{},"status",[424,964,672],{}," count every migration as unapplied. ",[424,967,968],{},"up --plan"," tells you how many steps it will take over:",[432,971,974],{"className":972,"code":973,"language":742,"meta":437},[740],"The classic runners applied 7 steps that have no step record. They read as applied, and the next up, mark_applied, mark_unapplied, or down records them.\n",[424,975,973],{"__ignoreMap":437},[420,977,978,980,981,984,985,787,988,991],{},[424,979,898],{}," then prints ",[424,982,983],{},"Adopted 7 steps that the classic runners applied."," and runs the rest. It leaves the old ",[424,986,987],{},"bun_migrations",[424,989,990],{},"ch_migrations"," tables in place.",[420,993,994],{},"The DEB and RPM packages do not restart Uptrace onto databases that still need migrations. The old process keeps serving until you run the commands above.",[541,996,998],{"id":997},"how-migrations-run","How migrations run",[420,1000,1001],{},"A migration can have up to three phases, and the processes switch to the new version in the middle:",[432,1003,1006],{"className":1004,"code":1005,"language":742,"meta":437},[740],"old version serves traffic\n   │  expand     add new tables, columns, and indexes; the old version keeps working\n   ▼\nrestart: every Uptrace process moves to the new version\nhold: some migrations pause a capability, for example alerts, while the next phases run\n   │  backfill   copy and convert existing rows into the new shape\n   │  finalize   remove what only the old version needed; build the final indexes\n   ▼\nrelease: the paused capabilities start again\n",[424,1007,1005],{"__ignoreMap":437},[622,1009,1010,1016,1028,1037],{},[625,1011,1012,1015],{},[715,1013,1014],{},"Expand"," runs while the old version still serves, so it only adds objects the old version can ignore.",[625,1017,1018,1021,1022,787,1024,1027],{},[715,1019,1020],{},"Restart required"," is the point where every ",[424,1023,806],{},[424,1025,1026],{},"worker"," process must run the new binary before the work continues.",[625,1029,1030,787,1033,1036],{},[715,1031,1032],{},"Hold",[715,1034,1035],{},"release"," pause and resume a capability for the duration of the backfill and finalize phases. No process restarts for them.",[625,1038,1039,787,1042,1045],{},[715,1040,1041],{},"Backfill",[715,1043,1044],{},"finalize"," run on the new version. A long backfill commits in batches, so a stop does not lose its progress.",[420,1047,1048,1050],{},[424,1049,426],{}," records every completed step in PostgreSQL. A second run skips completed steps and continues where the previous run stopped.",[541,1052,1054],{"id":1053},"preview-the-upgrade","Preview the upgrade",[420,1056,1057],{},"Use three read-only commands before you change anything. None of them takes a lock or writes to the databases.",[420,1059,1060],{},"See what the databases hold now:",[432,1062,1064],{"className":434,"code":1063,"language":436,"meta":437,"style":437},"uptrace migrate status\n",[424,1065,1066],{"__ignoreMap":437},[441,1067,1068,1070,1072],{"class":443,"line":444},[441,1069,467],{"class":466},[441,1071,512],{"class":470},[441,1073,1074],{"class":470}," status\n",[432,1076,1079],{"className":1077,"code":1078,"language":742,"meta":437},[740],"Status     behind\nApplied    41\nUnapplied  2\n\n  20260915101500_heatmap     unapplied\n  20260916090000_retention   unapplied\n\nRun: uptrace migrate up --plan\n",[424,1080,1078],{"__ignoreMap":437},[420,1082,1083,1084,1086],{},"See what ",[424,1085,898],{}," will do, in order:",[432,1088,1090],{"className":434,"code":1089,"language":436,"meta":437,"style":437},"uptrace migrate up --plan\n",[424,1091,1092],{"__ignoreMap":437},[441,1093,1094,1096,1098,1100],{"class":443,"line":444},[441,1095,467],{"class":466},[441,1097,512],{"class":470},[441,1099,515],{"class":470},[441,1101,518],{"class":487},[432,1103,1106],{"className":1104,"code":1105,"language":742,"meta":437},[740],"Plan  2 steps of 1 migration\n\nMigrations\n  20260922080949_demo_split_customer_name  split the customer name into first and last\n\n  #  migration                                step                  runs as\n  -  restart required                                               every process must run the new release\n  -  hold                                                           every process stops alerts and acks\n  1  20260922080949_demo_split_customer_name  2-backfill.up.pg.go   1 transaction per batch, resumes with cursor=4\n  2  20260922080949_demo_split_customer_name  3-finalize.up.pg.sql  6 statements, no transaction; a stop resumes the file\n  -  release                                                        every process starts alerts again\n\nCompleted, not run again\n     migration                                step                completed at\n     20260922080949_demo_split_customer_name  1-expand.up.pg.sql  2026-09-22 08:14:03 UTC, group 2\n\nTransactions      1 per batch of step 1\nRestart required  once: before step 1\nHolds             alerts: held before step 1, released after step 2\n",[424,1107,1105],{"__ignoreMap":437},[420,1109,1110,1111,1113,1114,1117,1118,1121],{},"In this example, an earlier run already completed the expand step, so the plan continues the backfill at its last batch. The ",[424,1112,1020],{}," line tells you whether the processes must switch versions, and the ",[424,1115,1116],{},"Holds"," line tells you which capabilities pause and for how long. Add ",[424,1119,1120],{},"--plan"," to the exact command you intend to run: the same flags select the same work.",[420,1123,1124],{},"To read the SQL itself, print it without running it:",[432,1126,1128],{"className":434,"code":1127,"language":436,"meta":437,"style":437},"uptrace migrate show\nuptrace migrate show --database pg\nuptrace migrate show --database ch\n",[424,1129,1130,1139,1154],{"__ignoreMap":437},[441,1131,1132,1134,1136],{"class":443,"line":444},[441,1133,467],{"class":466},[441,1135,512],{"class":470},[441,1137,1138],{"class":470}," show\n",[441,1140,1141,1143,1145,1148,1151],{"class":443,"line":451},[441,1142,467],{"class":466},[441,1144,512],{"class":470},[441,1146,1147],{"class":470}," show",[441,1149,1150],{"class":487}," --database",[441,1152,1153],{"class":470}," pg\n",[441,1155,1156,1158,1160,1162,1164],{"class":443,"line":457},[441,1157,467],{"class":466},[441,1159,512],{"class":470},[441,1161,1147],{"class":470},[441,1163,1150],{"class":487},[441,1165,1166],{"class":470}," ch\n",[541,1168,1170],{"id":1169},"choose-how-the-processes-restart","Choose how the processes restart",[420,1172,1173],{},"Every upgrade runs in the same order:",[710,1175,1176,1183,1191],{},[625,1177,1178,1179,1182],{},"The ",[715,1180,1181],{},"expand"," steps run while the old version serves.",[625,1184,1185,1186,787,1188,1190],{},"Every ",[424,1187,806],{},[424,1189,1026],{}," process moves to the new version.",[625,1192,1178,1193,787,1196,1198],{},[715,1194,1195],{},"backfill",[715,1197,1044],{}," steps run on the new version.",[420,1200,1201],{},"What differs is who moves the processes in step 2:",[549,1203,1204,1220],{},[552,1205,1206],{},[555,1207,1208,1211,1214,1217],{},[558,1209,1210],{},"Case",[558,1212,1213],{},"Who restarts the processes",[558,1215,1216],{},"Commands",[558,1218,1219],{},"Use it with",[565,1221,1222,1242,1263],{},[555,1223,1224,1230,1234,1239],{},[570,1225,1226],{},[585,1227,1229],{"href":1228},"#case-1-built-in-restarts","Built-in restarts",[570,1231,1232],{},[424,1233,426],{},[570,1235,1236],{},[424,1237,1238],{},"up --restart",[570,1240,1241],{},"systemd, Ansible",[555,1243,1244,1249,1252,1260],{},[570,1245,1246],{},[585,1247,1248],{"href":906},"Manual restarts",[570,1250,1251],{},"You",[570,1253,1254,1257,1258],{},[424,1255,1256],{},"up --before-release-change",", then restart, then ",[424,1259,898],{},[570,1261,1262],{},"systemd, any supervisor",[555,1264,1265,1270,1273,1276],{},[570,1266,1267],{},[585,1268,17],{"href":1269},"#case-3-kubernetes",[570,1271,1272],{},"Your deploy tool",[570,1274,1275],{},"The same as manual restarts, run as Jobs",[570,1277,1278],{},"Helm, Argo CD",[420,1280,1281,1282,1284,1285,1287,1288,1290],{},"Manual restarts and Kubernetes are the same case: ",[424,1283,898],{}," stops before step 2, something else changes the version, and a second ",[424,1286,898],{}," finishes the work. On Kubernetes, the deploy tool changes the image, and the two ",[424,1289,898],{}," runs are Jobs.",[420,1292,1293,1294,1296],{},"Use the same steps for a release that adds no migration. Then ",[424,1295,898],{}," runs nothing, and only the processes restart.",[1298,1299,1301],"h3",{"id":1300},"case-1-built-in-restarts","Case 1: built-in restarts",[420,1303,1304,1307,1308,1311,1312,1315],{},[424,1305,1306],{},"uptrace migrate up --restart"," does the whole upgrade in one run. It needs a supervisor that starts a stopped process again from the installed binary. The packaged systemd unit sets ",[424,1309,1310],{},"Restart=always",", so this works for the ",[585,1313,1314],{"href":46},"DEB, RPM, and binary installs",". The Ansible playbook uses this case.",[710,1317,1318,1338,1396],{},[625,1319,1320,1323,1324,642,1328,1332,1333,1337],{},[715,1321,1322],{},"Install the new version"," using ",[585,1325,1327],{"href":1326},"\u002Fget\u002Fhosted\u002Finstall#deb","DEB",[585,1329,1331],{"href":1330},"\u002Fget\u002Fhosted\u002Finstall#rpm","RPM",", or a ",[585,1334,1336],{"href":1335},"\u002Fget\u002Fhosted\u002Finstall#binaries","pre-compiled binary",". Do not restart the service.",[625,1339,1340,1343,1344,1375,1377,1380,1381,1384,1385,1387,1388,1391,1392,634],{},[715,1341,1342],{},"Fix and validate the config."," A new release can move or rename config options. The old keys keep working, but Uptrace logs a deprecation warning for each one. Review the fixes, apply them, and then validate the result:",[432,1345,1347],{"className":434,"code":1346,"language":436,"meta":437,"style":437},"uptrace config fix\nuptrace config fix --write\nuptrace config validate\n",[424,1348,1349,1357,1367],{"__ignoreMap":437},[441,1350,1351,1353,1355],{"class":443,"line":444},[441,1352,467],{"class":466},[441,1354,471],{"class":470},[441,1356,474],{"class":470},[441,1358,1359,1361,1363,1365],{"class":443,"line":451},[441,1360,467],{"class":466},[441,1362,471],{"class":470},[441,1364,484],{"class":470},[441,1366,488],{"class":487},[441,1368,1369,1371,1373],{"class":443,"line":457},[441,1370,467],{"class":466},[441,1372,471],{"class":470},[441,1374,498],{"class":470},[668,1376],{},[424,1378,1379],{},"config fix"," without ",[424,1382,1383],{},"--write"," prints each fix and a diff, and changes nothing. ",[424,1386,1383],{}," rewrites the file and keeps the original as ",[424,1389,1390],{},"config.yml.bak",". See ",[585,1393,1395],{"href":1394},"\u002Fget\u002Fhosted\u002Fconfig#fixing-deprecated-options","Fixing deprecated options",[625,1397,1398,1401],{},[715,1399,1400],{},"Apply the migrations and restart Uptrace:",[432,1402,1404],{"className":434,"code":1403,"language":436,"meta":437,"style":437},"uptrace migrate up --restart\n",[424,1405,1406],{"__ignoreMap":437},[441,1407,1408,1410,1412,1414],{"class":443,"line":444},[441,1409,467],{"class":466},[441,1411,512],{"class":470},[441,1413,515],{"class":470},[441,1415,536],{"class":487},[420,1417,1418,1420,1421,1423,1424,1426],{},[424,1419,1238],{}," runs the expand steps while the old version serves, then asks each running process to stop. systemd starts it again from the new binary. Workers restart first, then each ",[424,1422,806],{}," process one at a time, so the API keeps serving when you run more than one. After that, ",[424,1425,898],{}," runs the backfill and finalize steps. At the end, it restarts every process that the run did not restart yet, so each process reads the new binary, config, and data files.",[420,1428,1429],{},"Use the same command after you change only the config or a data file: it restarts every process even when no migration is left.",[420,1431,1432,1434,1435,1437],{},[424,1433,902],{}," bounds how long ",[424,1436,898],{}," waits for each restart (2 minutes by default):",[432,1439,1441],{"className":434,"code":1440,"language":436,"meta":437,"style":437},"uptrace migrate up --restart --wait 5m\n",[424,1442,1443],{"__ignoreMap":437},[441,1444,1445,1447,1449,1451,1454,1457],{"class":443,"line":444},[441,1446,467],{"class":466},[441,1448,512],{"class":470},[441,1450,515],{"class":470},[441,1452,1453],{"class":487}," --restart",[441,1455,1456],{"class":487}," --wait",[441,1458,1459],{"class":470}," 5m\n",[420,1461,1462,1463,1465],{},"If a process does not come back in time, ",[424,1464,898],{}," stops and names it. Fix the cause, for example a host where the new binary is not installed, and run the same command again.",[1298,1467,1469],{"id":1468},"case-2-manual-restarts","Case 2: manual restarts",[420,1471,1472,1473,1476,1477,1479],{},"Use this case when you restart the processes yourself, for example with ",[424,1474,1475],{},"systemctl"," on each host, or with a supervisor that ",[424,1478,891],{}," cannot use.",[710,1481,1482,1493,1517,1538],{},[625,1483,1484,1486,1487,1489,1490,634],{},[715,1485,1322],{}," without a restart. Run ",[424,1488,778],{}," to rewrite deprecated options, and run ",[424,1491,1492],{},"uptrace config validate",[625,1494,1495,1498,1499,1501,1502],{},[715,1496,1497],{},"Run the expand steps."," ",[424,1500,898],{}," stops before the restart and exits zero. The old version keeps serving:",[432,1503,1505],{"className":434,"code":1504,"language":436,"meta":437,"style":437},"uptrace migrate up --before-release-change\n",[424,1506,1507],{"__ignoreMap":437},[441,1508,1509,1511,1513,1515],{"class":443,"line":444},[441,1510,467],{"class":466},[441,1512,512],{"class":470},[441,1514,515],{"class":470},[441,1516,924],{"class":487},[625,1518,1519,1522,1523],{},[715,1520,1521],{},"Restart every Uptrace process"," on every host, so it runs the new binary:",[432,1524,1526],{"className":434,"code":1525,"language":436,"meta":437,"style":437},"sudo systemctl restart uptrace\n",[424,1527,1528],{"__ignoreMap":437},[441,1529,1530,1532,1534,1536],{"class":443,"line":444},[441,1531,929],{"class":466},[441,1533,932],{"class":470},[441,1535,935],{"class":470},[441,1537,938],{"class":470},[625,1539,1540,1543],{},[715,1541,1542],{},"Run the backfill and finalize steps:",[432,1544,1546],{"className":434,"code":1545,"language":436,"meta":437,"style":437},"uptrace migrate up\n",[424,1547,1548],{"__ignoreMap":437},[441,1549,1550,1552,1554],{"class":443,"line":444},[441,1551,467],{"class":466},[441,1553,512],{"class":470},[441,1555,947],{"class":470},[420,1557,1558,1559,1561,1562,1564,1565,1568,1569,1571],{},"Before the backfill, step 4 checks that every live process runs the new version. If one still runs the old version, ",[424,1560,898],{}," stops and names it. Restart that process and run ",[424,1563,898],{}," again, or pass ",[424,1566,1567],{},"--wait 10m"," to let ",[424,1570,898],{}," wait for the restarts:",[432,1573,1575],{"className":434,"code":1574,"language":436,"meta":437,"style":437},"uptrace migrate up --wait 10m\n",[424,1576,1577],{"__ignoreMap":437},[441,1578,1579,1581,1583,1585,1587],{"class":443,"line":444},[441,1580,467],{"class":466},[441,1582,512],{"class":470},[441,1584,515],{"class":470},[441,1586,1456],{"class":487},[441,1588,1589],{"class":470}," 10m\n",[1298,1591,1593],{"id":1592},"case-3-kubernetes","Case 3: Kubernetes",[420,1595,1596,1597,1599,1600,1603],{},"Kubernetes is case 2, with the deploy tool in step 3. The kubelet starts a stopped container again from the image of its pod spec, so only the deploy tool can move a pod to the new version. Run each ",[424,1598,898],{}," as a Job with the ",[715,1601,1602],{},"new"," image:",[432,1605,1608],{"className":1606,"code":1607,"language":742,"meta":437},[740],"1. pre-upgrade Job    uptrace migrate up --before-release-change\n2. deploy tool        change the image, and wait until the new pods are ready\n3. post-upgrade Job   uptrace migrate up --wait 10m\n",[424,1609,1607],{"__ignoreMap":437},[622,1611,1612,1618],{},[625,1613,1614,1615,1617],{},"Do not use ",[424,1616,891],{}," on Kubernetes. It would only restart each pod again on the same image.",[625,1619,1620,1621,1624,1625,1627],{},"Start step 3 only after the rollout completes. With Helm, run ",[424,1622,1623],{},"helm upgrade --wait",", so Helm runs the post-upgrade hooks after the resources are ready. With Argo CD, use a PostSync hook. If a pod still runs the old image, step 3 waits up to ",[424,1626,902],{}," for it, then stops and names the pod. Run the Job again after the rollout.",[420,1629,1630,1631,1634,1635,634],{},"The Helm chart runs these steps for you. A pre-upgrade Job runs step 1 with the new image and the new config, ",[424,1632,1633],{},"helm upgrade"," changes the image in step 2, and a post-upgrade Job runs step 3. If a Job fails, the upgrade stops, and the old pods keep serving. See ",[585,1636,1638],{"href":1637},"\u002Fget\u002Fhosted\u002Fk8s#upgrading-uptrace","upgrading with Helm",[1298,1640,641],{"id":1641},"docker",[420,1643,1644,1645,634],{},"Pull the new images and recreate the containers as described in ",[585,1646,1648],{"href":1647},"\u002Fget\u002Fhosted\u002Fdocker#upgrading-uptrace","upgrading with Docker",[541,1650,1652],{"id":1651},"check-the-result","Check the result",[420,1654,1655,1656,1658],{},"When the upgrade completes, ",[424,1657,962],{}," reports that the databases are up to date:",[432,1660,1661],{"className":434,"code":1063,"language":436,"meta":437,"style":437},[424,1662,1663],{"__ignoreMap":437},[441,1664,1665,1667,1669],{"class":443,"line":444},[441,1666,467],{"class":466},[441,1668,512],{"class":470},[441,1670,1074],{"class":470},[432,1672,1675],{"className":1673,"code":1674,"language":742,"meta":437},[740],"Status   up to date\nApplied  43\n",[424,1676,1674],{"__ignoreMap":437},[420,1678,1679,1680,1683],{},"In a script or a health check, use ",[424,1681,1682],{},"--fail-on-unapplied",". It exits non-zero when a migration is unapplied or a rollback did not finish:",[432,1685,1687],{"className":434,"code":1686,"language":436,"meta":437,"style":437},"uptrace migrate status --fail-on-unapplied\n",[424,1688,1689],{"__ignoreMap":437},[441,1690,1691,1693,1695,1698],{"class":443,"line":444},[441,1692,467],{"class":466},[441,1694,512],{"class":470},[441,1696,1697],{"class":470}," status",[441,1699,1700],{"class":487}," --fail-on-unapplied\n",[420,1702,1703],{},"To check what the upgraded processes see, read the report of each running process. It fails when a process serves with migrations that are not applied:",[432,1705,1707],{"className":434,"code":1706,"language":436,"meta":437,"style":437},"uptrace doctor --live\n",[424,1708,1709],{"__ignoreMap":437},[441,1710,1711,1713,1716],{"class":443,"line":444},[441,1712,467],{"class":466},[441,1714,1715],{"class":470}," doctor",[441,1717,1718],{"class":487}," --live\n",[541,1720,1722],{"id":1721},"when-a-migration-fails","When a migration fails",[420,1724,1725,1727],{},[424,1726,898],{}," exits non-zero, and the error names the step file that failed. The report shows which steps completed and where the next run continues:",[432,1729,1732],{"className":1730,"code":1731,"language":742,"meta":437},[740],"Apply  3 steps of 1 migration, group 2\n\n  #  migration                                step                  result\n  1  20260922080949_demo_split_customer_name  1-expand.up.pg.sql    completed  14ms\n  -  restart required                                               every process must run the new release\n  2  20260922080949_demo_split_customer_name  2-backfill.up.pg.go   failed     2 batches, cursor=4\n  3  20260922080949_demo_split_customer_name  3-finalize.up.pg.sql  not run\n\nA rerun continues step 2 with cursor=4.\n",[424,1733,1731],{"__ignoreMap":437},[420,1735,1736],{},"Take these steps in order:",[710,1738,1739,1760,1766],{},[625,1740,1741,1744],{},[715,1742,1743],{},"See where the run stopped:",[432,1745,1747],{"className":434,"code":1746,"language":436,"meta":437,"style":437},"uptrace migrate status --full\n",[424,1748,1749],{"__ignoreMap":437},[441,1750,1751,1753,1755,1757],{"class":443,"line":444},[441,1752,467],{"class":466},[441,1754,512],{"class":470},[441,1756,1697],{"class":470},[441,1758,1759],{"class":487}," --full\n",[625,1761,1762,1765],{},[715,1763,1764],{},"Fix the cause",", for example disk space, a ClickHouse server that went down, or a lock (see below).",[625,1767,1768,1774,1775],{},[715,1769,1770,1771,1773],{},"Run ",[424,1772,898],{}," again."," It skips every completed step:",[622,1776,1777,1780,1783,1786],{},[625,1778,1779],{},"a PostgreSQL expand step rolled back as a whole, so it runs again from the start;",[625,1781,1782],{},"a PostgreSQL backfill or finalize file continues at the first statement that did not complete;",[625,1784,1785],{},"a Go backfill continues at its last committed batch;",[625,1787,1788],{},"a ClickHouse file sends every statement again.",[1298,1790,1792],{"id":1791},"lock-timeouts","Lock timeouts",[420,1794,1795,1796,1798,1799,1802,1803,1806,1807,1810],{},"A PostgreSQL schema change waits for table locks. To avoid holding back the queries that queue behind it, ",[424,1797,898],{}," waits at most ",[424,1800,1801],{},"--lock-timeout"," (2 seconds by default) for each lock, then retries up to ",[424,1804,1805],{},"--lock-retries"," times (10 by default) with a growing pause. Before each retry it logs the transactions that hold the lock. An ",[424,1808,1809],{},"idle in transaction"," session is a frequent cause.",[420,1812,1813,1814,1816,1817,1819],{},"When the retries run out, ",[424,1815,898],{}," fails with a lock timeout. Close the blocking session and run ",[424,1818,898],{}," again, or raise the limits:",[432,1821,1823],{"className":434,"code":1822,"language":436,"meta":437,"style":437},"uptrace migrate up --lock-timeout 10s --lock-retries 30\n",[424,1824,1825],{"__ignoreMap":437},[441,1826,1827,1829,1831,1833,1836,1839,1842],{"class":443,"line":444},[441,1828,467],{"class":466},[441,1830,512],{"class":470},[441,1832,515],{"class":470},[441,1834,1835],{"class":487}," --lock-timeout",[441,1837,1838],{"class":470}," 10s",[441,1840,1841],{"class":487}," --lock-retries",[441,1843,1844],{"class":487}," 30\n",[1298,1846,1848],{"id":1847},"mark-a-migration-by-hand","Mark a migration by hand",[420,1850,1851,1852,1855],{},"Use ",[424,1853,1854],{},"mark_applied"," only when you confirmed that the work of the migration is already in the database, for example after you applied it by hand. A marked step never runs:",[432,1857,1859],{"className":434,"code":1858,"language":436,"meta":437,"style":437},"uptrace migrate mark_applied --version 20260922080949\n",[424,1860,1861],{"__ignoreMap":437},[441,1862,1863,1865,1867,1870,1873],{"class":443,"line":444},[441,1864,467],{"class":466},[441,1866,512],{"class":470},[441,1868,1869],{"class":470}," mark_applied",[441,1871,1872],{"class":487}," --version",[441,1874,1875],{"class":487}," 20260922080949\n",[420,1877,1878,1880,1881,1884,1885,1887],{},[424,1879,962],{}," cannot confirm the work for you: read the step files (",[424,1882,1883],{},"uptrace migrate show --version ...",") and check each object they create. When you are not sure, run ",[424,1886,898],{}," again instead.",[420,1889,1890],{},"To take a wrong mark back without running any SQL:",[432,1892,1894],{"className":434,"code":1893,"language":436,"meta":437,"style":437},"uptrace migrate mark_unapplied --version 20260922080949\n",[424,1895,1896],{"__ignoreMap":437},[441,1897,1898,1900,1902,1905,1907],{"class":443,"line":444},[441,1899,467],{"class":466},[441,1901,512],{"class":470},[441,1903,1904],{"class":470}," mark_unapplied",[441,1906,1872],{"class":487},[441,1908,1875],{"class":487},[541,1910,1912],{"id":1911},"schema-drift","Schema drift",[420,1914,1915,1916,1918,1919,1921],{},"Before it runs, ",[424,1917,898],{}," compares the live schemas with the schema that the newest applied migration expects. If someone changed the schema outside the migrations, ",[424,1920,898],{}," prints an error and runs nothing:",[432,1923,1926],{"className":1924,"code":1925,"language":742,"meta":437},[740],"ERROR: the PostgreSQL schema differs from each schema that migration 20260926142252_slo_subject_unknown lists.\n  expected: sha256:6f81…\n            sha256:c9b8…\n  live:     sha256:8345…\nA change outside the migrations causes this.\nNo migration runs. To see each difference, run:\n  uptrace migrate diff\nIf you accept the differences, run the same command again with --allow-schema-drift:\n  uptrace migrate up --allow-schema-drift\nThe flag works with --plan and --version too.\n",[424,1927,1925],{"__ignoreMap":437},[420,1929,1930],{},"See each difference:",[432,1932,1934],{"className":434,"code":1933,"language":436,"meta":437,"style":437},"uptrace migrate diff\n",[424,1935,1936],{"__ignoreMap":437},[441,1937,1938,1940,1942],{"class":443,"line":444},[441,1939,467],{"class":466},[441,1941,512],{"class":470},[441,1943,1944],{"class":470}," diff\n",[420,1946,1947,1950,1951,1954],{},[424,1948,1949],{},"diff"," builds scratch PostgreSQL and ClickHouse databases with the migrations your databases completed, prints each object that differs, and drops the scratch databases. The PostgreSQL user needs the ",[424,1952,1953],{},"CREATEDB"," privilege.",[420,1956,1957],{},"If you accept each difference, for example an index someone added by hand or a new major PostgreSQL version that prints a definition differently, continue with:",[432,1959,1961],{"className":434,"code":1960,"language":436,"meta":437,"style":437},"uptrace migrate up --allow-schema-drift\n",[424,1962,1963],{"__ignoreMap":437},[441,1964,1965,1967,1969,1971],{"class":443,"line":444},[441,1966,467],{"class":466},[441,1968,512],{"class":470},[441,1970,515],{"class":470},[441,1972,1973],{"class":487}," --allow-schema-drift\n",[541,1975,1977],{"id":1976},"roll-back","Roll back",[420,1979,1980],{},"Down steps restore the shape of the schema. They restore data only where a migration writes it back. If the data matters, restore the backups you took before the upgrade.",[420,1982,1983],{},"Preview the rollback first:",[432,1985,1987],{"className":434,"code":1986,"language":436,"meta":437,"style":437},"uptrace migrate down --plan\n",[424,1988,1989],{"__ignoreMap":437},[441,1990,1991,1993,1995,1998],{"class":443,"line":444},[441,1992,467],{"class":466},[441,1994,512],{"class":470},[441,1996,1997],{"class":470}," down",[441,1999,518],{"class":487},[420,2001,2002,2003,2006,2007,2010],{},"A bare ",[424,2004,2005],{},"down"," rolls back the newest work: a run that stopped, otherwise the last group of migrations that ran together. Pass ",[424,2008,2009],{},"--version"," to roll back one migration.",[420,2012,2013,2014,2016],{},"A rollback runs with the ",[715,2015,1602],{}," binary, because only the new binary contains the down steps. Keep a copy of it before you install the old version. A rollback mirrors the upgrade: the finalize and backfill down steps run while the new version serves, the processes move back to the old version, and the expand down steps run last. The three cases work the same way.",[420,2018,2019],{},[715,2020,2021],{},"Built-in restarts:",[432,2023,2025],{"className":434,"code":2024,"language":436,"meta":437,"style":437},"# 1. With the new binary installed, run the down steps that the new version needs.\nuptrace migrate down --before-release-change\n\n# 2. Install the old binary.\n\n# 3. With the kept copy of the new binary, restart Uptrace on the old version and finish the rollback.\n\u002Fpath\u002Fto\u002Fnew\u002Fuptrace migrate down --restart\n",[424,2026,2027,2032,2042,2047,2052,2056,2061],{"__ignoreMap":437},[441,2028,2029],{"class":443,"line":444},[441,2030,2031],{"class":447},"# 1. With the new binary installed, run the down steps that the new version needs.\n",[441,2033,2034,2036,2038,2040],{"class":443,"line":451},[441,2035,467],{"class":466},[441,2037,512],{"class":470},[441,2039,1997],{"class":470},[441,2041,924],{"class":487},[441,2043,2044],{"class":443,"line":457},[441,2045,2046],{"emptyLinePlaceholder":34},"\n",[441,2048,2049],{"class":443,"line":463},[441,2050,2051],{"class":447},"# 2. Install the old binary.\n",[441,2053,2054],{"class":443,"line":477},[441,2055,2046],{"emptyLinePlaceholder":34},[441,2057,2058],{"class":443,"line":491},[441,2059,2060],{"class":447},"# 3. With the kept copy of the new binary, restart Uptrace on the old version and finish the rollback.\n",[441,2062,2063,2066,2068,2070],{"class":443,"line":501},[441,2064,2065],{"class":466},"\u002Fpath\u002Fto\u002Fnew\u002Fuptrace",[441,2067,512],{"class":470},[441,2069,1997],{"class":470},[441,2071,536],{"class":487},[420,2073,2074],{},[715,2075,2076],{},"Manual restarts:",[432,2078,2080],{"className":434,"code":2079,"language":436,"meta":437,"style":437},"# 1. With the new binary installed, run the down steps that the new version needs.\nuptrace migrate down --before-release-change\n\n# 2. Install the old binary, and restart every Uptrace process.\nsudo systemctl restart uptrace\n\n# 3. With the kept copy of the new binary, finish the rollback.\n\u002Fpath\u002Fto\u002Fnew\u002Fuptrace migrate down\n",[424,2081,2082,2086,2096,2100,2105,2115,2119,2124],{"__ignoreMap":437},[441,2083,2084],{"class":443,"line":444},[441,2085,2031],{"class":447},[441,2087,2088,2090,2092,2094],{"class":443,"line":451},[441,2089,467],{"class":466},[441,2091,512],{"class":470},[441,2093,1997],{"class":470},[441,2095,924],{"class":487},[441,2097,2098],{"class":443,"line":457},[441,2099,2046],{"emptyLinePlaceholder":34},[441,2101,2102],{"class":443,"line":463},[441,2103,2104],{"class":447},"# 2. Install the old binary, and restart every Uptrace process.\n",[441,2106,2107,2109,2111,2113],{"class":443,"line":477},[441,2108,929],{"class":466},[441,2110,932],{"class":470},[441,2112,935],{"class":470},[441,2114,938],{"class":470},[441,2116,2117],{"class":443,"line":491},[441,2118,2046],{"emptyLinePlaceholder":34},[441,2120,2121],{"class":443,"line":501},[441,2122,2123],{"class":447},"# 3. With the kept copy of the new binary, finish the rollback.\n",[441,2125,2126,2128,2130],{"class":443,"line":507},[441,2127,2065],{"class":466},[441,2129,512],{"class":470},[441,2131,2132],{"class":470}," down\n",[420,2134,2135,2138,2139,1599,2141,2143],{},[715,2136,2137],{},"Kubernetes:"," run each ",[424,2140,2005],{},[715,2142,1602],{}," image, and change the image back with the deploy tool between them:",[432,2145,2148],{"className":2146,"code":2147,"language":742,"meta":437},[740],"1. Job           uptrace migrate down --before-release-change\n2. deploy tool   change the image back to the old version, and wait until the pods are ready\n3. Job           uptrace migrate down\n",[424,2149,2147],{"__ignoreMap":437},[420,2151,2152,2153,2156],{},"Do not roll back through ",[424,2154,2155],{},"helm rollback"," hooks. Helm runs the hooks of the old revision, and the old image does not contain the down steps of the new migrations.",[420,2158,2159,2160,2162,2163,2165],{},"Give both runs of ",[424,2161,2005],{}," the same selection: the same ",[424,2164,2009],{},", or none.",[420,2167,2168,2169,2171,2172,2174,2175,2177],{},"A rollback that did not finish blocks ",[424,2170,898],{},". ",[424,2173,898],{}," refuses to start and names the ",[424,2176,2005],{}," command that finishes it.",[541,2179,2181],{"id":2180},"command-reference","Command reference",[549,2183,2184,2194],{},[552,2185,2186],{},[555,2187,2188,2191],{},[558,2189,2190],{},"Command",[558,2192,2193],{},"What it does",[565,2195,2196,2205,2214,2234,2244,2254,2264,2274,2287,2300],{},[555,2197,2198,2202],{},[570,2199,2200],{},[424,2201,865],{},[570,2203,2204],{},"Prints which migrations are applied, and where a step stopped. Writes nothing.",[555,2206,2207,2211],{},[570,2208,2209],{},[424,2210,836],{},[570,2212,2213],{},"Runs every step of the unapplied migrations.",[555,2215,2216,2221],{},[570,2217,2218],{},[424,2219,2220],{},"uptrace migrate show",[570,2222,2223,2224,2226,2227,2229,2230,2233],{},"Prints the SQL that ",[424,2225,898],{}," (or ",[424,2228,2005],{}," with ",[424,2231,2232],{},"--down",") would send. Runs nothing.",[555,2235,2236,2241],{},[570,2237,2238],{},[424,2239,2240],{},"uptrace migrate down",[570,2242,2243],{},"Runs the down steps of one migration or of the newest work.",[555,2245,2246,2251],{},[570,2247,2248],{},[424,2249,2250],{},"uptrace migrate mark_applied",[570,2252,2253],{},"Records steps as completed without running them.",[555,2255,2256,2261],{},[570,2257,2258],{},[424,2259,2260],{},"uptrace migrate mark_unapplied",[570,2262,2263],{},"Deletes the step records of one migration without running any SQL.",[555,2265,2266,2271],{},[570,2267,2268],{},[424,2269,2270],{},"uptrace migrate diff",[570,2272,2273],{},"Compares the live schemas with freshly migrated scratch databases.",[555,2275,2276,2281],{},[570,2277,2278],{},[424,2279,2280],{},"uptrace migrate init",[570,2282,2283,2284,2286],{},"Creates the step record table. ",[424,2285,898],{}," does it too, so you rarely need it.",[555,2288,2289,2294],{},[570,2290,2291],{},[424,2292,2293],{},"uptrace migrate reset",[570,2295,2296,2297,2299],{},"Drops the databases and creates them again, empty. Run ",[424,2298,898],{}," after it.",[555,2301,2302,2307],{},[570,2303,2304],{},[424,2305,2306],{},"uptrace migrate truncate",[570,2308,2309],{},"Deletes every row, and keeps the tables and the migration records.",[420,2311,2312],{},"Common flags:",[549,2314,2315,2327],{},[552,2316,2317],{},[555,2318,2319,2322,2324],{},[558,2320,2321],{},"Flag",[558,2323,1216],{},[558,2325,2326],{},"Meaning",[565,2328,2329,2344,2365,2385,2401,2416,2429,2442,2456,2470,2483,2503],{},[555,2330,2331,2335,2341],{},[570,2332,2333],{},[424,2334,1120],{},[570,2336,2337,642,2339],{},[424,2338,898],{},[424,2340,2005],{},[570,2342,2343],{},"Print what the command would run, and run nothing.",[555,2345,2346,2350,2362],{},[570,2347,2348],{},[424,2349,2009],{},[570,2351,2352,642,2354,642,2356,642,2359],{},[424,2353,898],{},[424,2355,2005],{},[424,2357,2358],{},"show",[424,2360,2361],{},"mark_*",[570,2363,2364],{},"Select one migration by its 14-digit version.",[555,2366,2367,2371,2377],{},[570,2368,2369],{},[424,2370,891],{},[570,2372,2373,642,2375],{},[424,2374,898],{},[424,2376,2005],{},[570,2378,2379,2380,787,2382,2384],{},"Restart the ",[424,2381,806],{},[424,2383,1026],{}," processes at each restart point. Needs a supervisor such as systemd.",[555,2386,2387,2392,2398],{},[570,2388,2389],{},[424,2390,2391],{},"--before-release-change",[570,2393,2394,642,2396],{},[424,2395,898],{},[424,2397,2005],{},[570,2399,2400],{},"Stop before the point where the processes must switch versions, and exit zero.",[555,2402,2403,2407,2413],{},[570,2404,2405],{},[424,2406,902],{},[570,2408,2409,642,2411],{},[424,2410,898],{},[424,2412,2005],{},[570,2414,2415],{},"How long to wait for processes to restart or acknowledge a hold.",[555,2417,2418,2422,2426],{},[570,2419,2420],{},[424,2421,1801],{},[570,2423,2424],{},[424,2425,898],{},[570,2427,2428],{},"How long one PostgreSQL statement waits for a lock before it retries (default 2s).",[555,2430,2431,2435,2439],{},[570,2432,2433],{},[424,2434,1805],{},[570,2436,2437],{},[424,2438,898],{},[570,2440,2441],{},"How many times a statement retries after a lock timeout (default 10).",[555,2443,2444,2449,2453],{},[570,2445,2446],{},[424,2447,2448],{},"--allow-schema-drift",[570,2450,2451],{},[424,2452,898],{},[570,2454,2455],{},"Run even when a live schema differs from what the migrations expect.",[555,2457,2458,2463,2467],{},[570,2459,2460],{},[424,2461,2462],{},"--full",[570,2464,2465],{},[424,2466,962],{},[570,2468,2469],{},"Print every migration and every step.",[555,2471,2472,2476,2480],{},[570,2473,2474],{},[424,2475,1682],{},[570,2477,2478],{},[424,2479,962],{},[570,2481,2482],{},"Exit non-zero when a migration is unapplied or a rollback did not finish.",[555,2484,2485,2490,2500],{},[570,2486,2487],{},[424,2488,2489],{},"--database pg|ch",[570,2491,2492,642,2494,642,2497],{},[424,2493,2358],{},[424,2495,2496],{},"reset",[424,2498,2499],{},"truncate",[570,2501,2502],{},"Work on one database only.",[555,2504,2505,2509,2513],{},[570,2506,2507],{},[424,2508,2232],{},[570,2510,2511],{},[424,2512,2358],{},[570,2514,2515],{},"Print the down steps instead of the up steps.",[2517,2518,2519],"style",{},"html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":437,"searchDepth":463,"depth":451,"links":2521},[2522,2523,2524,2525,2526,2527,2533,2534,2538,2539,2540],{"id":543,"depth":451,"text":544},{"id":616,"depth":451,"text":617},{"id":700,"depth":451,"text":588},{"id":997,"depth":451,"text":998},{"id":1053,"depth":451,"text":1054},{"id":1169,"depth":451,"text":1170,"children":2528},[2529,2530,2531,2532],{"id":1300,"depth":457,"text":1301},{"id":1468,"depth":457,"text":1469},{"id":1592,"depth":457,"text":1593},{"id":1641,"depth":457,"text":641},{"id":1651,"depth":451,"text":1652},{"id":1721,"depth":451,"text":1722,"children":2535},[2536,2537],{"id":1791,"depth":457,"text":1792},{"id":1847,"depth":457,"text":1848},{"id":1911,"depth":451,"text":1912},{"id":1976,"depth":451,"text":1977},{"id":2180,"depth":451,"text":2181},"2026-10-01","Upgrade self-hosted Uptrace with the migrate command: preview the plan, apply migrations with zero-downtime restarts, recover from a failed step, and roll back.","md","\u002Fget\u002Fcover\u002Fupgrade.webp",{"readingTime":2546},{"text":2547,"minutes":2548,"time":2549,"words":2550},"15 min read",14.79,887400,2958,{"title":65},{"title":414,"description":2542},false,"mjBWIQ7ZL8qAPTDPsvRQT8mU9Vwk9GTgNLNmUKwUIBU",[2556,2558],{"title":61,"path":62,"stem":63,"description":2557,"children":-1},"Reference guide for the main Uptrace configuration options, including databases, authentication, MCP, and ClickHouse tuning.",{"title":69,"path":70,"stem":71,"description":2559,"children":-1},"Troubleshoot self-hosted Uptrace by checking versions, reading service logs, and enabling verbose ClickHouse or PostgreSQL diagnostics.",1791361924659]