[{"data":1,"prerenderedAt":1860},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fstreams\u002Fresumable-load-walkthrough":3},{"id":4,"title":5,"body":6,"description":1851,"extension":1852,"meta":1853,"navigation":1854,"path":1855,"redirect":1856,"seo":1857,"stem":1858,"__hash__":1859},"docs\u002Fdocs\u002Fstreams\u002Fresumable-load-walkthrough.md","Resumable Load Walkthrough",{"type":7,"value":8,"toc":1831},"minimark",[9,14,18,27,32,66,70,87,106,110,254,257,261,264,413,416,431,434,438,441,907,917,921,924,977,985,1004,1057,1060,1204,1215,1219,1222,1272,1279,1352,1355,1359,1362,1410,1418,1421,1471,1474,1578,1583,1587,1589,1643,1649,1653,1669,1673,1683,1686,1715,1722,1725,1784,1787,1791,1799,1803,1827],[10,11,13],"h1",{"id":12},"resumable-load-walkthrough","Resumable load walkthrough",[15,16,17],"p",{},"This page shows a complete Load-mode example that uses the automatic resumable snapshot-copy path. You will create one eligible source table, start a Load stream, stop it after at least one chunk completes, start the same stream config again, and verify that DBConvert Streams resumes from the next incomplete primary-key range instead of restarting the whole table.",[15,19,20,21,26],{},"For the routing rules and state semantics, read ",[22,23,25],"a",{"href":24},"\u002Fdocs\u002Fstreams\u002Fresumable-load","Resumable Load"," first.",[28,29,31],"h2",{"id":30},"what-you-will-build","What you will build",[33,34,35,43,49,59],"ul",{},[36,37,38,39],"li",{},"Source table ",[40,41,42],"code",{},"public.orders_resumable_demo",[36,44,45,46],{},"Target schema ",[40,47,48],{},"rsnap_demo",[36,50,51,52,55,56],{},"One Load stream using ",[40,53,54],{},"schemaPolicy=create_missing_only"," and ",[40,57,58],{},"writeMode=upsert",[36,60,61,62,65],{},"One stop\u002Fstart cycle that resumes from durable ",[40,63,64],{},"loadProgress"," state",[28,67,69],{"id":68},"prerequisites","Prerequisites",[33,71,72,75,78,81,84],{},[36,73,74],{},"PostgreSQL source and PostgreSQL target connections already exist in DBConvert Streams",[36,76,77],{},"API base URL, API key, and install ID are available",[36,79,80],{},"No custom SQL on the selected table",[36,82,83],{},"The target schema is empty or dedicated to this walkthrough",[36,85,86],{},"The source table uses a single numeric primary key",[15,88,89,90,93,94,97,98,101,102,105],{},"This walkthrough uses source IDs ",[40,91,92],{},"1..250000",". In the current implementation, resumable Load uses internal ",[40,95,96],{},"pk_range"," chunking with a width of ",[40,99,100],{},"50000",", so this table plans ",[40,103,104],{},"5"," chunks.",[28,107,109],{"id":108},"set-shell-variables","Set shell variables",[111,112,117],"pre",{"className":113,"code":114,"language":115,"meta":116,"style":116},"language-bash shiki shiki-themes github-light github-dark","export HOST=\"http:\u002F\u002F127.0.0.1:8020\u002Fapi\u002Fv1\"\nexport API_KEY=\"YOUR_API_KEY\"\nexport INSTALL_ID=\"YOUR_INSTALL_ID\"\n\nexport SOURCE_CONNECTION_ID=\"conn_pg_source\"\nexport TARGET_CONNECTION_ID=\"conn_pg_target\"\n\nexport SOURCE_DATABASE=\"postgres\"\nexport SOURCE_SCHEMA=\"public\"\nexport TARGET_DATABASE=\"postgres\"\nexport TARGET_SCHEMA=\"rsnap_demo\"\n","bash","",[40,118,119,139,152,165,172,185,198,203,216,229,241],{"__ignoreMap":116},[120,121,124,128,132,135],"span",{"class":122,"line":123},"line",1,[120,125,127],{"class":126},"szBVR","export",[120,129,131],{"class":130},"sVt8B"," HOST",[120,133,134],{"class":126},"=",[120,136,138],{"class":137},"sZZnC","\"http:\u002F\u002F127.0.0.1:8020\u002Fapi\u002Fv1\"\n",[120,140,142,144,147,149],{"class":122,"line":141},2,[120,143,127],{"class":126},[120,145,146],{"class":130}," API_KEY",[120,148,134],{"class":126},[120,150,151],{"class":137},"\"YOUR_API_KEY\"\n",[120,153,155,157,160,162],{"class":122,"line":154},3,[120,156,127],{"class":126},[120,158,159],{"class":130}," INSTALL_ID",[120,161,134],{"class":126},[120,163,164],{"class":137},"\"YOUR_INSTALL_ID\"\n",[120,166,168],{"class":122,"line":167},4,[120,169,171],{"emptyLinePlaceholder":170},true,"\n",[120,173,175,177,180,182],{"class":122,"line":174},5,[120,176,127],{"class":126},[120,178,179],{"class":130}," SOURCE_CONNECTION_ID",[120,181,134],{"class":126},[120,183,184],{"class":137},"\"conn_pg_source\"\n",[120,186,188,190,193,195],{"class":122,"line":187},6,[120,189,127],{"class":126},[120,191,192],{"class":130}," TARGET_CONNECTION_ID",[120,194,134],{"class":126},[120,196,197],{"class":137},"\"conn_pg_target\"\n",[120,199,201],{"class":122,"line":200},7,[120,202,171],{"emptyLinePlaceholder":170},[120,204,206,208,211,213],{"class":122,"line":205},8,[120,207,127],{"class":126},[120,209,210],{"class":130}," SOURCE_DATABASE",[120,212,134],{"class":126},[120,214,215],{"class":137},"\"postgres\"\n",[120,217,219,221,224,226],{"class":122,"line":218},9,[120,220,127],{"class":126},[120,222,223],{"class":130}," SOURCE_SCHEMA",[120,225,134],{"class":126},[120,227,228],{"class":137},"\"public\"\n",[120,230,232,234,237,239],{"class":122,"line":231},10,[120,233,127],{"class":126},[120,235,236],{"class":130}," TARGET_DATABASE",[120,238,134],{"class":126},[120,240,215],{"class":137},[120,242,244,246,249,251],{"class":122,"line":243},11,[120,245,127],{"class":126},[120,247,248],{"class":130}," TARGET_SCHEMA",[120,250,134],{"class":126},[120,252,253],{"class":137},"\"rsnap_demo\"\n",[15,255,256],{},"Replace the connection IDs and database names with values from your environment.",[28,258,260],{"id":259},"_1-create-the-source-table-and-clean-target-state","1. Create the source table and clean target state",[15,262,263],{},"On the PostgreSQL source:",[111,265,269],{"className":266,"code":267,"language":268,"meta":116,"style":116},"language-sql shiki shiki-themes github-light github-dark","DROP TABLE IF EXISTS public.orders_resumable_demo;\n\nCREATE TABLE public.orders_resumable_demo (\n    id BIGINT PRIMARY KEY,\n    customer_id BIGINT NOT NULL,\n    amount NUMERIC(10,2) NOT NULL,\n    status TEXT NOT NULL,\n    created_at TIMESTAMP NOT NULL\n);\n\nINSERT INTO public.orders_resumable_demo (id, customer_id, amount, status, created_at)\nSELECT i,\n       ((i - 1) % 10000) + 1,\n       ROUND((10 + (i % 5000) * 0.25)::numeric, 2),\n       CASE\n           WHEN i % 5 = 0 THEN 'paid'\n           WHEN i % 5 = 1 THEN 'pending'\n           WHEN i % 5 = 2 THEN 'packed'\n           WHEN i % 5 = 3 THEN 'shipped'\n           ELSE 'delivered'\n       END,\n       TIMESTAMP '2026-01-01 00:00:00' + ((i - 1) * INTERVAL '1 second')\nFROM generate_series(1, 250000) AS i;\n\nSELECT COUNT(*) FROM public.orders_resumable_demo;\n-- 250000\n","sql",[40,270,271,276,280,285,290,295,300,305,310,315,319,324,330,336,342,348,354,360,366,372,378,384,390,396,401,407],{"__ignoreMap":116},[120,272,273],{"class":122,"line":123},[120,274,275],{},"DROP TABLE IF EXISTS public.orders_resumable_demo;\n",[120,277,278],{"class":122,"line":141},[120,279,171],{"emptyLinePlaceholder":170},[120,281,282],{"class":122,"line":154},[120,283,284],{},"CREATE TABLE public.orders_resumable_demo (\n",[120,286,287],{"class":122,"line":167},[120,288,289],{},"    id BIGINT PRIMARY KEY,\n",[120,291,292],{"class":122,"line":174},[120,293,294],{},"    customer_id BIGINT NOT NULL,\n",[120,296,297],{"class":122,"line":187},[120,298,299],{},"    amount NUMERIC(10,2) NOT NULL,\n",[120,301,302],{"class":122,"line":200},[120,303,304],{},"    status TEXT NOT NULL,\n",[120,306,307],{"class":122,"line":205},[120,308,309],{},"    created_at TIMESTAMP NOT NULL\n",[120,311,312],{"class":122,"line":218},[120,313,314],{},");\n",[120,316,317],{"class":122,"line":231},[120,318,171],{"emptyLinePlaceholder":170},[120,320,321],{"class":122,"line":243},[120,322,323],{},"INSERT INTO public.orders_resumable_demo (id, customer_id, amount, status, created_at)\n",[120,325,327],{"class":122,"line":326},12,[120,328,329],{},"SELECT i,\n",[120,331,333],{"class":122,"line":332},13,[120,334,335],{},"       ((i - 1) % 10000) + 1,\n",[120,337,339],{"class":122,"line":338},14,[120,340,341],{},"       ROUND((10 + (i % 5000) * 0.25)::numeric, 2),\n",[120,343,345],{"class":122,"line":344},15,[120,346,347],{},"       CASE\n",[120,349,351],{"class":122,"line":350},16,[120,352,353],{},"           WHEN i % 5 = 0 THEN 'paid'\n",[120,355,357],{"class":122,"line":356},17,[120,358,359],{},"           WHEN i % 5 = 1 THEN 'pending'\n",[120,361,363],{"class":122,"line":362},18,[120,364,365],{},"           WHEN i % 5 = 2 THEN 'packed'\n",[120,367,369],{"class":122,"line":368},19,[120,370,371],{},"           WHEN i % 5 = 3 THEN 'shipped'\n",[120,373,375],{"class":122,"line":374},20,[120,376,377],{},"           ELSE 'delivered'\n",[120,379,381],{"class":122,"line":380},21,[120,382,383],{},"       END,\n",[120,385,387],{"class":122,"line":386},22,[120,388,389],{},"       TIMESTAMP '2026-01-01 00:00:00' + ((i - 1) * INTERVAL '1 second')\n",[120,391,393],{"class":122,"line":392},23,[120,394,395],{},"FROM generate_series(1, 250000) AS i;\n",[120,397,399],{"class":122,"line":398},24,[120,400,171],{"emptyLinePlaceholder":170},[120,402,404],{"class":122,"line":403},25,[120,405,406],{},"SELECT COUNT(*) FROM public.orders_resumable_demo;\n",[120,408,410],{"class":122,"line":409},26,[120,411,412],{},"-- 250000\n",[15,414,415],{},"On the PostgreSQL target:",[111,417,419],{"className":266,"code":418,"language":268,"meta":116,"style":116},"CREATE SCHEMA IF NOT EXISTS rsnap_demo;\nDROP TABLE IF EXISTS rsnap_demo.orders_resumable_demo;\n",[40,420,421,426],{"__ignoreMap":116},[120,422,423],{"class":122,"line":123},[120,424,425],{},"CREATE SCHEMA IF NOT EXISTS rsnap_demo;\n",[120,427,428],{"class":122,"line":141},[120,429,430],{},"DROP TABLE IF EXISTS rsnap_demo.orders_resumable_demo;\n",[15,432,433],{},"The target table must not contain old rows from a previous run. This walkthrough lets DBConvert Streams create the missing table on the first start.",[28,435,437],{"id":436},"_2-create-the-load-stream-config","2. Create the Load stream config",[15,439,440],{},"Create a stream config that selects only the demo table and uses an eligible target policy:",[111,442,444],{"className":113,"code":443,"language":115,"meta":116,"style":116},"curl -s -X POST \"$HOST\u002Fstream-configs\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -H \"X-API-Key: $API_KEY\" \\\n  -H \"X-Install-ID: $INSTALL_ID\" \\\n  -d \"{\n    \\\"name\\\": \\\"resumable-load-demo\\\",\n    \\\"mode\\\": \\\"load\\\",\n    \\\"source\\\": {\n      \\\"connections\\\": [\n        {\n          \\\"connectionId\\\": \\\"$SOURCE_CONNECTION_ID\\\",\n          \\\"database\\\": \\\"$SOURCE_DATABASE\\\",\n          \\\"schema\\\": \\\"$SOURCE_SCHEMA\\\",\n          \\\"tables\\\": [\n            { \\\"name\\\": \\\"orders_resumable_demo\\\" }\n          ]\n        }\n      ],\n      \\\"options\\\": {\n        \\\"dataBundleSize\\\": 5000\n      }\n    },\n    \\\"target\\\": {\n      \\\"id\\\": \\\"$TARGET_CONNECTION_ID\\\",\n      \\\"spec\\\": {\n        \\\"db\\\": {\n          \\\"database\\\": \\\"$TARGET_DATABASE\\\",\n          \\\"schema\\\": \\\"$TARGET_SCHEMA\\\",\n          \\\"schemaPolicy\\\": \\\"create_missing_only\\\",\n          \\\"writeMode\\\": \\\"upsert\\\"\n        }\n      }\n    },\n    \\\"reportingInterval\\\": 1\n  }\"\n",[40,445,446,474,484,499,513,521,545,565,577,590,595,616,636,656,667,690,695,700,705,716,729,734,739,750,770,781,792,812,832,853,873,878,883,888,901],{"__ignoreMap":116},[120,447,448,452,456,459,462,465,468,471],{"class":122,"line":123},[120,449,451],{"class":450},"sScJk","curl",[120,453,455],{"class":454},"sj4cs"," -s",[120,457,458],{"class":454}," -X",[120,460,461],{"class":137}," POST",[120,463,464],{"class":137}," \"",[120,466,467],{"class":130},"$HOST",[120,469,470],{"class":137},"\u002Fstream-configs\"",[120,472,473],{"class":454}," \\\n",[120,475,476,479,482],{"class":122,"line":141},[120,477,478],{"class":454},"  -H",[120,480,481],{"class":137}," \"Content-Type: application\u002Fjson\"",[120,483,473],{"class":454},[120,485,486,488,491,494,497],{"class":122,"line":154},[120,487,478],{"class":454},[120,489,490],{"class":137}," \"X-API-Key: ",[120,492,493],{"class":130},"$API_KEY",[120,495,496],{"class":137},"\"",[120,498,473],{"class":454},[120,500,501,503,506,509,511],{"class":122,"line":167},[120,502,478],{"class":454},[120,504,505],{"class":137}," \"X-Install-ID: ",[120,507,508],{"class":130},"$INSTALL_ID",[120,510,496],{"class":137},[120,512,473],{"class":454},[120,514,515,518],{"class":122,"line":174},[120,516,517],{"class":454},"  -d",[120,519,520],{"class":137}," \"{\n",[120,522,523,526,529,532,535,537,540,542],{"class":122,"line":187},[120,524,525],{"class":454},"    \\\"",[120,527,528],{"class":137},"name",[120,530,531],{"class":454},"\\\"",[120,533,534],{"class":137},": ",[120,536,531],{"class":454},[120,538,539],{"class":137},"resumable-load-demo",[120,541,531],{"class":454},[120,543,544],{"class":137},",\n",[120,546,547,549,552,554,556,558,561,563],{"class":122,"line":200},[120,548,525],{"class":454},[120,550,551],{"class":137},"mode",[120,553,531],{"class":454},[120,555,534],{"class":137},[120,557,531],{"class":454},[120,559,560],{"class":137},"load",[120,562,531],{"class":454},[120,564,544],{"class":137},[120,566,567,569,572,574],{"class":122,"line":205},[120,568,525],{"class":454},[120,570,571],{"class":137},"source",[120,573,531],{"class":454},[120,575,576],{"class":137},": {\n",[120,578,579,582,585,587],{"class":122,"line":218},[120,580,581],{"class":454},"      \\\"",[120,583,584],{"class":137},"connections",[120,586,531],{"class":454},[120,588,589],{"class":137},": [\n",[120,591,592],{"class":122,"line":231},[120,593,594],{"class":137},"        {\n",[120,596,597,600,603,605,607,609,612,614],{"class":122,"line":243},[120,598,599],{"class":454},"          \\\"",[120,601,602],{"class":137},"connectionId",[120,604,531],{"class":454},[120,606,534],{"class":137},[120,608,531],{"class":454},[120,610,611],{"class":130},"$SOURCE_CONNECTION_ID",[120,613,531],{"class":454},[120,615,544],{"class":137},[120,617,618,620,623,625,627,629,632,634],{"class":122,"line":326},[120,619,599],{"class":454},[120,621,622],{"class":137},"database",[120,624,531],{"class":454},[120,626,534],{"class":137},[120,628,531],{"class":454},[120,630,631],{"class":130},"$SOURCE_DATABASE",[120,633,531],{"class":454},[120,635,544],{"class":137},[120,637,638,640,643,645,647,649,652,654],{"class":122,"line":332},[120,639,599],{"class":454},[120,641,642],{"class":137},"schema",[120,644,531],{"class":454},[120,646,534],{"class":137},[120,648,531],{"class":454},[120,650,651],{"class":130},"$SOURCE_SCHEMA",[120,653,531],{"class":454},[120,655,544],{"class":137},[120,657,658,660,663,665],{"class":122,"line":338},[120,659,599],{"class":454},[120,661,662],{"class":137},"tables",[120,664,531],{"class":454},[120,666,589],{"class":137},[120,668,669,672,674,676,678,680,682,685,687],{"class":122,"line":344},[120,670,671],{"class":137},"            { ",[120,673,531],{"class":454},[120,675,528],{"class":137},[120,677,531],{"class":454},[120,679,534],{"class":137},[120,681,531],{"class":454},[120,683,684],{"class":137},"orders_resumable_demo",[120,686,531],{"class":454},[120,688,689],{"class":137}," }\n",[120,691,692],{"class":122,"line":350},[120,693,694],{"class":137},"          ]\n",[120,696,697],{"class":122,"line":356},[120,698,699],{"class":137},"        }\n",[120,701,702],{"class":122,"line":362},[120,703,704],{"class":137},"      ],\n",[120,706,707,709,712,714],{"class":122,"line":368},[120,708,581],{"class":454},[120,710,711],{"class":137},"options",[120,713,531],{"class":454},[120,715,576],{"class":137},[120,717,718,721,724,726],{"class":122,"line":374},[120,719,720],{"class":454},"        \\\"",[120,722,723],{"class":137},"dataBundleSize",[120,725,531],{"class":454},[120,727,728],{"class":137},": 5000\n",[120,730,731],{"class":122,"line":380},[120,732,733],{"class":137},"      }\n",[120,735,736],{"class":122,"line":386},[120,737,738],{"class":137},"    },\n",[120,740,741,743,746,748],{"class":122,"line":392},[120,742,525],{"class":454},[120,744,745],{"class":137},"target",[120,747,531],{"class":454},[120,749,576],{"class":137},[120,751,752,754,757,759,761,763,766,768],{"class":122,"line":398},[120,753,581],{"class":454},[120,755,756],{"class":137},"id",[120,758,531],{"class":454},[120,760,534],{"class":137},[120,762,531],{"class":454},[120,764,765],{"class":130},"$TARGET_CONNECTION_ID",[120,767,531],{"class":454},[120,769,544],{"class":137},[120,771,772,774,777,779],{"class":122,"line":403},[120,773,581],{"class":454},[120,775,776],{"class":137},"spec",[120,778,531],{"class":454},[120,780,576],{"class":137},[120,782,783,785,788,790],{"class":122,"line":409},[120,784,720],{"class":454},[120,786,787],{"class":137},"db",[120,789,531],{"class":454},[120,791,576],{"class":137},[120,793,795,797,799,801,803,805,808,810],{"class":122,"line":794},27,[120,796,599],{"class":454},[120,798,622],{"class":137},[120,800,531],{"class":454},[120,802,534],{"class":137},[120,804,531],{"class":454},[120,806,807],{"class":130},"$TARGET_DATABASE",[120,809,531],{"class":454},[120,811,544],{"class":137},[120,813,815,817,819,821,823,825,828,830],{"class":122,"line":814},28,[120,816,599],{"class":454},[120,818,642],{"class":137},[120,820,531],{"class":454},[120,822,534],{"class":137},[120,824,531],{"class":454},[120,826,827],{"class":130},"$TARGET_SCHEMA",[120,829,531],{"class":454},[120,831,544],{"class":137},[120,833,835,837,840,842,844,846,849,851],{"class":122,"line":834},29,[120,836,599],{"class":454},[120,838,839],{"class":137},"schemaPolicy",[120,841,531],{"class":454},[120,843,534],{"class":137},[120,845,531],{"class":454},[120,847,848],{"class":137},"create_missing_only",[120,850,531],{"class":454},[120,852,544],{"class":137},[120,854,856,858,861,863,865,867,870],{"class":122,"line":855},30,[120,857,599],{"class":454},[120,859,860],{"class":137},"writeMode",[120,862,531],{"class":454},[120,864,534],{"class":137},[120,866,531],{"class":454},[120,868,869],{"class":137},"upsert",[120,871,872],{"class":454},"\\\"\n",[120,874,876],{"class":122,"line":875},31,[120,877,699],{"class":137},[120,879,881],{"class":122,"line":880},32,[120,882,733],{"class":137},[120,884,886],{"class":122,"line":885},33,[120,887,738],{"class":137},[120,889,891,893,896,898],{"class":122,"line":890},34,[120,892,525],{"class":454},[120,894,895],{"class":137},"reportingInterval",[120,897,531],{"class":454},[120,899,900],{"class":137},": 1\n",[120,902,904],{"class":122,"line":903},35,[120,905,906],{"class":137},"  }\"\n",[15,908,909,910,912,913,916],{},"Save the returned stream-config ",[40,911,756],{}," as ",[40,914,915],{},"CONFIG_ID",".",[28,918,920],{"id":919},"_3-start-the-first-run-and-wait-for-one-completed-chunk","3. Start the first run and wait for one completed chunk",[15,922,923],{},"Start the stream:",[111,925,927],{"className":113,"code":926,"language":115,"meta":116,"style":116},"curl -s -X POST \"$HOST\u002Fstream-configs\u002F$CONFIG_ID\u002Fstart\" \\\n  -H \"X-API-Key: $API_KEY\" \\\n  -H \"X-Install-ID: $INSTALL_ID\"\n",[40,928,929,954,966],{"__ignoreMap":116},[120,930,931,933,935,937,939,941,943,946,949,952],{"class":122,"line":123},[120,932,451],{"class":450},[120,934,455],{"class":454},[120,936,458],{"class":454},[120,938,461],{"class":137},[120,940,464],{"class":137},[120,942,467],{"class":130},[120,944,945],{"class":137},"\u002Fstream-configs\u002F",[120,947,948],{"class":130},"$CONFIG_ID",[120,950,951],{"class":137},"\u002Fstart\"",[120,953,473],{"class":454},[120,955,956,958,960,962,964],{"class":122,"line":141},[120,957,478],{"class":454},[120,959,490],{"class":137},[120,961,493],{"class":130},[120,963,496],{"class":137},[120,965,473],{"class":454},[120,967,968,970,972,974],{"class":122,"line":154},[120,969,478],{"class":454},[120,971,505],{"class":137},[120,973,508],{"class":130},[120,975,976],{"class":137},"\"\n",[15,978,979,980,912,982,916],{},"Save the returned stream ",[40,981,756],{},[40,983,984],{},"STREAM_ID",[15,986,987,988,991,992,995,996,999,1000,1003],{},"Check the stats endpoint until ",[40,989,990],{},"loadProgress.chunksCompleted"," is at least ",[40,993,994],{},"1"," while the top-level stream ",[40,997,998],{},"status"," is still ",[40,1001,1002],{},"RUNNING",":",[111,1005,1007],{"className":113,"code":1006,"language":115,"meta":116,"style":116},"curl -s -X GET \"$HOST\u002Fstreams\u002F$STREAM_ID\u002Fstats\" \\\n  -H \"X-API-Key: $API_KEY\" \\\n  -H \"X-Install-ID: $INSTALL_ID\"\n",[40,1008,1009,1035,1047],{"__ignoreMap":116},[120,1010,1011,1013,1015,1017,1020,1022,1024,1027,1030,1033],{"class":122,"line":123},[120,1012,451],{"class":450},[120,1014,455],{"class":454},[120,1016,458],{"class":454},[120,1018,1019],{"class":137}," GET",[120,1021,464],{"class":137},[120,1023,467],{"class":130},[120,1025,1026],{"class":137},"\u002Fstreams\u002F",[120,1028,1029],{"class":130},"$STREAM_ID",[120,1031,1032],{"class":137},"\u002Fstats\"",[120,1034,473],{"class":454},[120,1036,1037,1039,1041,1043,1045],{"class":122,"line":141},[120,1038,478],{"class":454},[120,1040,490],{"class":137},[120,1042,493],{"class":130},[120,1044,496],{"class":137},[120,1046,473],{"class":454},[120,1048,1049,1051,1053,1055],{"class":122,"line":154},[120,1050,478],{"class":454},[120,1052,505],{"class":137},[120,1054,508],{"class":130},[120,1056,976],{"class":137},[15,1058,1059],{},"Expected shape during the first run:",[111,1061,1065],{"className":1062,"code":1063,"language":1064,"meta":116,"style":116},"language-json shiki shiki-themes github-light github-dark","{\n  \"status\": \"RUNNING\",\n  \"loadProgress\": {\n    \"status\": \"copying\",\n    \"strategy\": \"pk_range\",\n    \"mode\": \"load\",\n    \"tablesPlanned\": 1,\n    \"tablesCompleted\": 0,\n    \"chunksPlanned\": 5,\n    \"chunksCompleted\": 1,\n    \"currentTable\": \"public.orders_resumable_demo\",\n    \"currentChunk\": 2\n  }\n}\n","json",[40,1066,1067,1072,1084,1091,1103,1115,1127,1138,1150,1161,1172,1184,1194,1199],{"__ignoreMap":116},[120,1068,1069],{"class":122,"line":123},[120,1070,1071],{"class":130},"{\n",[120,1073,1074,1077,1079,1082],{"class":122,"line":141},[120,1075,1076],{"class":454},"  \"status\"",[120,1078,534],{"class":130},[120,1080,1081],{"class":137},"\"RUNNING\"",[120,1083,544],{"class":130},[120,1085,1086,1089],{"class":122,"line":154},[120,1087,1088],{"class":454},"  \"loadProgress\"",[120,1090,576],{"class":130},[120,1092,1093,1096,1098,1101],{"class":122,"line":167},[120,1094,1095],{"class":454},"    \"status\"",[120,1097,534],{"class":130},[120,1099,1100],{"class":137},"\"copying\"",[120,1102,544],{"class":130},[120,1104,1105,1108,1110,1113],{"class":122,"line":174},[120,1106,1107],{"class":454},"    \"strategy\"",[120,1109,534],{"class":130},[120,1111,1112],{"class":137},"\"pk_range\"",[120,1114,544],{"class":130},[120,1116,1117,1120,1122,1125],{"class":122,"line":187},[120,1118,1119],{"class":454},"    \"mode\"",[120,1121,534],{"class":130},[120,1123,1124],{"class":137},"\"load\"",[120,1126,544],{"class":130},[120,1128,1129,1132,1134,1136],{"class":122,"line":200},[120,1130,1131],{"class":454},"    \"tablesPlanned\"",[120,1133,534],{"class":130},[120,1135,994],{"class":454},[120,1137,544],{"class":130},[120,1139,1140,1143,1145,1148],{"class":122,"line":205},[120,1141,1142],{"class":454},"    \"tablesCompleted\"",[120,1144,534],{"class":130},[120,1146,1147],{"class":454},"0",[120,1149,544],{"class":130},[120,1151,1152,1155,1157,1159],{"class":122,"line":218},[120,1153,1154],{"class":454},"    \"chunksPlanned\"",[120,1156,534],{"class":130},[120,1158,104],{"class":454},[120,1160,544],{"class":130},[120,1162,1163,1166,1168,1170],{"class":122,"line":231},[120,1164,1165],{"class":454},"    \"chunksCompleted\"",[120,1167,534],{"class":130},[120,1169,994],{"class":454},[120,1171,544],{"class":130},[120,1173,1174,1177,1179,1182],{"class":122,"line":243},[120,1175,1176],{"class":454},"    \"currentTable\"",[120,1178,534],{"class":130},[120,1180,1181],{"class":137},"\"public.orders_resumable_demo\"",[120,1183,544],{"class":130},[120,1185,1186,1189,1191],{"class":122,"line":326},[120,1187,1188],{"class":454},"    \"currentChunk\"",[120,1190,534],{"class":130},[120,1192,1193],{"class":454},"2\n",[120,1195,1196],{"class":122,"line":332},[120,1197,1198],{"class":130},"  }\n",[120,1200,1201],{"class":122,"line":338},[120,1202,1203],{"class":130},"}\n",[15,1205,1206,1207,1210,1211,1214],{},"Exact timestamps and the in-flight ",[40,1208,1209],{},"currentChunk"," can vary, but ",[40,1212,1213],{},"chunksCompleted"," must advance before you stop the run.",[28,1216,1218],{"id":1217},"_4-stop-the-first-run","4. Stop the first run",[15,1220,1221],{},"Stop the active stream:",[111,1223,1225],{"className":113,"code":1224,"language":115,"meta":116,"style":116},"curl -s -X POST \"$HOST\u002Fstreams\u002F$STREAM_ID\u002Fstop\" \\\n  -H \"X-API-Key: $API_KEY\" \\\n  -H \"X-Install-ID: $INSTALL_ID\"\n",[40,1226,1227,1250,1262],{"__ignoreMap":116},[120,1228,1229,1231,1233,1235,1237,1239,1241,1243,1245,1248],{"class":122,"line":123},[120,1230,451],{"class":450},[120,1232,455],{"class":454},[120,1234,458],{"class":454},[120,1236,461],{"class":137},[120,1238,464],{"class":137},[120,1240,467],{"class":130},[120,1242,1026],{"class":137},[120,1244,1029],{"class":130},[120,1246,1247],{"class":137},"\u002Fstop\"",[120,1249,473],{"class":454},[120,1251,1252,1254,1256,1258,1260],{"class":122,"line":141},[120,1253,478],{"class":454},[120,1255,490],{"class":137},[120,1257,493],{"class":130},[120,1259,496],{"class":137},[120,1261,473],{"class":454},[120,1263,1264,1266,1268,1270],{"class":122,"line":154},[120,1265,478],{"class":454},[120,1267,505],{"class":137},[120,1269,508],{"class":130},[120,1271,976],{"class":137},[15,1273,1274,1275,1278],{},"Poll the same stats endpoint until the stream reaches ",[40,1276,1277],{},"STOPPED",". The stopped run should still show at least one completed chunk:",[111,1280,1282],{"className":1062,"code":1281,"language":1064,"meta":116,"style":116},"{\n  \"status\": \"STOPPED\",\n  \"loadProgress\": {\n    \"status\": \"copying\",\n    \"strategy\": \"pk_range\",\n    \"mode\": \"load\",\n    \"chunksCompleted\": 1\n  }\n}\n",[40,1283,1284,1288,1299,1305,1315,1325,1335,1344,1348],{"__ignoreMap":116},[120,1285,1286],{"class":122,"line":123},[120,1287,1071],{"class":130},[120,1289,1290,1292,1294,1297],{"class":122,"line":141},[120,1291,1076],{"class":454},[120,1293,534],{"class":130},[120,1295,1296],{"class":137},"\"STOPPED\"",[120,1298,544],{"class":130},[120,1300,1301,1303],{"class":122,"line":154},[120,1302,1088],{"class":454},[120,1304,576],{"class":130},[120,1306,1307,1309,1311,1313],{"class":122,"line":167},[120,1308,1095],{"class":454},[120,1310,534],{"class":130},[120,1312,1100],{"class":137},[120,1314,544],{"class":130},[120,1316,1317,1319,1321,1323],{"class":122,"line":174},[120,1318,1107],{"class":454},[120,1320,534],{"class":130},[120,1322,1112],{"class":137},[120,1324,544],{"class":130},[120,1326,1327,1329,1331,1333],{"class":122,"line":187},[120,1328,1119],{"class":454},[120,1330,534],{"class":130},[120,1332,1124],{"class":137},[120,1334,544],{"class":130},[120,1336,1337,1339,1341],{"class":122,"line":200},[120,1338,1165],{"class":454},[120,1340,534],{"class":130},[120,1342,1343],{"class":454},"1\n",[120,1345,1346],{"class":122,"line":205},[120,1347,1198],{"class":130},[120,1349,1350],{"class":122,"line":218},[120,1351,1203],{"class":130},[15,1353,1354],{},"The copy is incomplete, but the completed chunk boundary is already durable.",[28,1356,1358],{"id":1357},"_5-start-the-same-config-again","5. Start the same config again",[15,1360,1361],{},"Start the same stream config, not a new one:",[111,1363,1364],{"className":113,"code":926,"language":115,"meta":116,"style":116},[40,1365,1366,1388,1400],{"__ignoreMap":116},[120,1367,1368,1370,1372,1374,1376,1378,1380,1382,1384,1386],{"class":122,"line":123},[120,1369,451],{"class":450},[120,1371,455],{"class":454},[120,1373,458],{"class":454},[120,1375,461],{"class":137},[120,1377,464],{"class":137},[120,1379,467],{"class":130},[120,1381,945],{"class":137},[120,1383,948],{"class":130},[120,1385,951],{"class":137},[120,1387,473],{"class":454},[120,1389,1390,1392,1394,1396,1398],{"class":122,"line":141},[120,1391,478],{"class":454},[120,1393,490],{"class":137},[120,1395,493],{"class":130},[120,1397,496],{"class":137},[120,1399,473],{"class":454},[120,1401,1402,1404,1406,1408],{"class":122,"line":154},[120,1403,478],{"class":454},[120,1405,505],{"class":137},[120,1407,508],{"class":130},[120,1409,976],{"class":137},[15,1411,1412,1413,912,1415,916],{},"Save the new stream ",[40,1414,756],{},[40,1416,1417],{},"RESUMED_STREAM_ID",[15,1419,1420],{},"Check the stats endpoint again:",[111,1422,1424],{"className":113,"code":1423,"language":115,"meta":116,"style":116},"curl -s -X GET \"$HOST\u002Fstreams\u002F$RESUMED_STREAM_ID\u002Fstats\" \\\n  -H \"X-API-Key: $API_KEY\" \\\n  -H \"X-Install-ID: $INSTALL_ID\"\n",[40,1425,1426,1449,1461],{"__ignoreMap":116},[120,1427,1428,1430,1432,1434,1436,1438,1440,1442,1445,1447],{"class":122,"line":123},[120,1429,451],{"class":450},[120,1431,455],{"class":454},[120,1433,458],{"class":454},[120,1435,1019],{"class":137},[120,1437,464],{"class":137},[120,1439,467],{"class":130},[120,1441,1026],{"class":137},[120,1443,1444],{"class":130},"$RESUMED_STREAM_ID",[120,1446,1032],{"class":137},[120,1448,473],{"class":454},[120,1450,1451,1453,1455,1457,1459],{"class":122,"line":141},[120,1452,478],{"class":454},[120,1454,490],{"class":137},[120,1456,493],{"class":130},[120,1458,496],{"class":137},[120,1460,473],{"class":454},[120,1462,1463,1465,1467,1469],{"class":122,"line":154},[120,1464,478],{"class":454},[120,1466,505],{"class":137},[120,1468,508],{"class":130},[120,1470,976],{"class":137},[15,1472,1473],{},"Expected terminal result:",[111,1475,1477],{"className":1062,"code":1476,"language":1064,"meta":116,"style":116},"{\n  \"status\": \"FINISHED\",\n  \"loadProgress\": {\n    \"status\": \"complete\",\n    \"strategy\": \"pk_range\",\n    \"mode\": \"load\",\n    \"tablesPlanned\": 1,\n    \"tablesCompleted\": 1,\n    \"chunksPlanned\": 5,\n    \"chunksCompleted\": 5\n  }\n}\n",[40,1478,1479,1483,1494,1500,1511,1521,1531,1541,1551,1561,1570,1574],{"__ignoreMap":116},[120,1480,1481],{"class":122,"line":123},[120,1482,1071],{"class":130},[120,1484,1485,1487,1489,1492],{"class":122,"line":141},[120,1486,1076],{"class":454},[120,1488,534],{"class":130},[120,1490,1491],{"class":137},"\"FINISHED\"",[120,1493,544],{"class":130},[120,1495,1496,1498],{"class":122,"line":154},[120,1497,1088],{"class":454},[120,1499,576],{"class":130},[120,1501,1502,1504,1506,1509],{"class":122,"line":167},[120,1503,1095],{"class":454},[120,1505,534],{"class":130},[120,1507,1508],{"class":137},"\"complete\"",[120,1510,544],{"class":130},[120,1512,1513,1515,1517,1519],{"class":122,"line":174},[120,1514,1107],{"class":454},[120,1516,534],{"class":130},[120,1518,1112],{"class":137},[120,1520,544],{"class":130},[120,1522,1523,1525,1527,1529],{"class":122,"line":187},[120,1524,1119],{"class":454},[120,1526,534],{"class":130},[120,1528,1124],{"class":137},[120,1530,544],{"class":130},[120,1532,1533,1535,1537,1539],{"class":122,"line":200},[120,1534,1131],{"class":454},[120,1536,534],{"class":130},[120,1538,994],{"class":454},[120,1540,544],{"class":130},[120,1542,1543,1545,1547,1549],{"class":122,"line":205},[120,1544,1142],{"class":454},[120,1546,534],{"class":130},[120,1548,994],{"class":454},[120,1550,544],{"class":130},[120,1552,1553,1555,1557,1559],{"class":122,"line":218},[120,1554,1154],{"class":454},[120,1556,534],{"class":130},[120,1558,104],{"class":454},[120,1560,544],{"class":130},[120,1562,1563,1565,1567],{"class":122,"line":231},[120,1564,1165],{"class":454},[120,1566,534],{"class":130},[120,1568,1569],{"class":454},"5\n",[120,1571,1572],{"class":122,"line":243},[120,1573,1198],{"class":130},[120,1575,1576],{"class":122,"line":326},[120,1577,1203],{"class":130},[15,1579,1580,1581,916],{},"This is the key check: the resumed run finishes the planned chunks for the same config instead of rebuilding the target from chunk ",[40,1582,1147],{},[28,1584,1586],{"id":1585},"_6-verify-the-target-rows","6. Verify the target rows",[15,1588,415],{},[111,1590,1592],{"className":266,"code":1591,"language":268,"meta":116,"style":116},"SELECT COUNT(*) AS rows,\n       COUNT(DISTINCT id) AS distinct_ids,\n       MIN(id) AS min_id,\n       MAX(id) AS max_id\nFROM rsnap_demo.orders_resumable_demo;\n\n-- rows=250000\n-- distinct_ids=250000\n-- min_id=1\n-- max_id=250000\n",[40,1593,1594,1599,1604,1609,1614,1619,1623,1628,1633,1638],{"__ignoreMap":116},[120,1595,1596],{"class":122,"line":123},[120,1597,1598],{},"SELECT COUNT(*) AS rows,\n",[120,1600,1601],{"class":122,"line":141},[120,1602,1603],{},"       COUNT(DISTINCT id) AS distinct_ids,\n",[120,1605,1606],{"class":122,"line":154},[120,1607,1608],{},"       MIN(id) AS min_id,\n",[120,1610,1611],{"class":122,"line":167},[120,1612,1613],{},"       MAX(id) AS max_id\n",[120,1615,1616],{"class":122,"line":174},[120,1617,1618],{},"FROM rsnap_demo.orders_resumable_demo;\n",[120,1620,1621],{"class":122,"line":187},[120,1622,171],{"emptyLinePlaceholder":170},[120,1624,1625],{"class":122,"line":200},[120,1626,1627],{},"-- rows=250000\n",[120,1629,1630],{"class":122,"line":205},[120,1631,1632],{},"-- distinct_ids=250000\n",[120,1634,1635],{"class":122,"line":218},[120,1636,1637],{},"-- min_id=1\n",[120,1639,1640],{"class":122,"line":231},[120,1641,1642],{},"-- max_id=250000\n",[15,1644,1645,1646,916],{},"If you also compare with the source row count, both sides should report ",[40,1647,1648],{},"250000",[28,1650,1652],{"id":1651},"what-this-walkthrough-proves","What this walkthrough proves",[33,1654,1655,1658,1663,1666],{},[36,1656,1657],{},"The table is eligible for automatic resumable Load routing",[36,1659,1660,1662],{},[40,1661,64],{}," state is persisted by stream config ID",[36,1664,1665],{},"Stopping the run after a completed chunk does not force a full re-copy",[36,1667,1668],{},"The resumed run converges on the same final target row set without duplicate primary keys",[28,1670,1672],{"id":1671},"troubleshooting","Troubleshooting",[1674,1675,1677,1679,1680],"h3",{"id":1676},"loadprogress-is-missing-from-streamsidstats",[40,1678,64],{}," is missing from ",[40,1681,1682],{},"\u002Fstreams\u002F{id}\u002Fstats",[15,1684,1685],{},"The table is not on the resumable path. Re-check the active config:",[33,1687,1688,1691,1699,1709,1712],{},[36,1689,1690],{},"source and target are both databases",[36,1692,1693,1694,1696,1697],{},"target ",[40,1695,860],{}," is ",[40,1698,869],{},[36,1700,1693,1701,1696,1703,1705,1706],{},[40,1702,839],{},[40,1704,848],{}," or ",[40,1707,1708],{},"validate_existing",[36,1710,1711],{},"selected table uses a single numeric primary key",[36,1713,1714],{},"no custom SQL query is attached to the table",[1674,1716,1718,1719],{"id":1717},"restart-returns-reset_required","Restart returns ",[40,1720,1721],{},"reset_required",[15,1723,1724],{},"The saved snapshot-copy state no longer matches the target or selected table shape. Reset the config state explicitly:",[111,1726,1728],{"className":113,"code":1727,"language":115,"meta":116,"style":116},"curl -s -X POST \"$HOST\u002Fstream-configs\u002F$CONFIG_ID\u002Freset\" \\\n  -H \"X-API-Key: $API_KEY\" \\\n  -H \"X-Install-ID: $INSTALL_ID\" \\\n  -H \"X-Confirm-Reset: true\"\n",[40,1729,1730,1753,1765,1777],{"__ignoreMap":116},[120,1731,1732,1734,1736,1738,1740,1742,1744,1746,1748,1751],{"class":122,"line":123},[120,1733,451],{"class":450},[120,1735,455],{"class":454},[120,1737,458],{"class":454},[120,1739,461],{"class":137},[120,1741,464],{"class":137},[120,1743,467],{"class":130},[120,1745,945],{"class":137},[120,1747,948],{"class":130},[120,1749,1750],{"class":137},"\u002Freset\"",[120,1752,473],{"class":454},[120,1754,1755,1757,1759,1761,1763],{"class":122,"line":141},[120,1756,478],{"class":454},[120,1758,490],{"class":137},[120,1760,493],{"class":130},[120,1762,496],{"class":137},[120,1764,473],{"class":454},[120,1766,1767,1769,1771,1773,1775],{"class":122,"line":154},[120,1768,478],{"class":454},[120,1770,505],{"class":137},[120,1772,508],{"class":130},[120,1774,496],{"class":137},[120,1776,473],{"class":454},[120,1778,1779,1781],{"class":122,"line":167},[120,1780,478],{"class":454},[120,1782,1783],{"class":137}," \"X-Confirm-Reset: true\"\n",[15,1785,1786],{},"For Load mode, reset clears the durable recovery keys and truncates the target rows loaded by this config, so the next start can run as a fresh first load.",[1674,1788,1790],{"id":1789},"the-run-finishes-before-you-can-stop-it","The run finishes before you can stop it",[15,1792,1793,1794,1796,1797,916],{},"Increase the source row count and repeat the walkthrough on a clean target schema. The resume check is easiest when the first run stays active long enough for ",[40,1795,1213],{}," to move past ",[40,1798,1147],{},[28,1800,1802],{"id":1801},"related-docs","Related docs",[33,1804,1805,1809,1815,1821],{},[36,1806,1807],{},[22,1808,25],{"href":24},[36,1810,1811],{},[22,1812,1814],{"href":1813},"\u002Fdocs\u002Fintegration\u002Fconversion-mode","Load Mode",[36,1816,1817],{},[22,1818,1820],{"href":1819},"\u002Fdocs\u002Fstreams\u002Ftarget-data-policies","Target Data Policies",[36,1822,1823],{},[22,1824,1826],{"href":1825},"\u002Fdocs\u002Fstreams\u002Fstream-config-reference","Stream Configuration Reference",[1828,1829,1830],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}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);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":116,"searchDepth":141,"depth":141,"links":1832},[1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1850],{"id":30,"depth":141,"text":31},{"id":68,"depth":141,"text":69},{"id":108,"depth":141,"text":109},{"id":259,"depth":141,"text":260},{"id":436,"depth":141,"text":437},{"id":919,"depth":141,"text":920},{"id":1217,"depth":141,"text":1218},{"id":1357,"depth":141,"text":1358},{"id":1585,"depth":141,"text":1586},{"id":1651,"depth":141,"text":1652},{"id":1671,"depth":141,"text":1672,"children":1844},[1845,1847,1849],{"id":1676,"depth":154,"text":1846},"loadProgress is missing from \u002Fstreams\u002F{id}\u002Fstats",{"id":1717,"depth":154,"text":1848},"Restart returns reset_required",{"id":1789,"depth":154,"text":1790},{"id":1801,"depth":141,"text":1802},"End-to-end example of an eligible Load stream that stops mid-copy and resumes from the next incomplete chunk.","md",{},false,"\u002Fdocs\u002Fstreams\u002Fresumable-load-walkthrough",null,{"title":5,"description":1851},"docs\u002Fstreams\u002Fresumable-load-walkthrough","ccomwJ0TWfUOJNHs5ogAjPb6IbKl2_QjLyBpFapcqE8",1783896284822]