ALTER INDEX
The ALTER INDEX statement moves the placement of an existing index or replica among different GSI nodes.
(Introduced in Couchbase Server 5.5 Enterprise Edition)
Purpose
Use the ALTER INDEX
statement to change the placement of an existing index or replica among different GSI nodes when you encounter any of the following situations:
-
An imbalance occurs due to a particular index growing faster than expected and is needed on a different node.
-
An imbalance occurs due to a cluster of indexes being dropped on a single node.
-
A machine is scheduled for removal, so its indexes need to move off its current node.
-
The automated process of rebalancing does not give the expected results.
-
Other types of scaling up or scaling down are needed.
For example, if a node fails and you need to move it from node 172.23.130.24 to node 172.23.130.25, then you can simply execute the following code with your own index names and addresses:
CREATE INDEX idx1 ON `travel-sample`(id, airline) WHERE type="route"; ALTER INDEX `travel-sample`.idx1 WITH {"action":"move","nodes": ["172.23.120.25:8091"]}
The ALTER INDEX move operation is asynchronous. As soon as the move alter index command is executed, the command returns. If there is no error in the input, the move operation can be tracked through the console UI and any error can be found in the Console logs and Indexer logs. |
If a node goes down while an ALTER INDEX operation is in progress, then the index would rollback to its original node (not affecting queries) and a notification would appear.
Prerequisites
Only users with the suitable RBAC role of Administrator
are allowed to run the ALTER INDEX
directive.
This directive is applicable only for Standard GSI (Plasma) and MOI Indexes; and hence supported only for Enterprise Edition nodes. (Not Applicable for Forest DB).
This statement is supported only from 5.5 onwards; if the cluster is in mix-mode (a mix of 5.5 and previous versions), then this directive will not work.
ALTER INDEX
will not work while the cluster is undergoing a Rebalance.
Syntax



ALTER INDEX key_expr [ USING GSI ] WITH {"action":"action_name", "nodes": [ "node_expr" [, "node_expr2"]* }
Arguments
- key_expr
-
[Required] String representing the corresponding named keyspace reference, with an optional index name for example
named_keyspace_ref.index_name
. USING GSI
-
USING GSI
"]Uses the Global Secondary Index.
WITH
-
[Required] Specifies the alter operation that needs to be performed.
action
-
[Required] Reserved word for denoting the single
action_name
operation to be performed. - action_name
-
- move
-
[Required] Moves only 1 index (or its replica) at a time to a different node while not making any changes to the index topology, for example, the number of replicas remain the same.
The length of the nodes array must be equal to the number of index replicas.
nodes
-
[Required] Reserved word for denoting the node list that specifies the new destination nodes for the index and its replicas.
The full node list needs to be specified even if only 1 replica needs to be moved. - node_expr
-
[Required] String of the destination node address or addresses.
Return Value
If the ALTER INDEX
succeeds, then:
-
The Query Workbench will show
{ Results: [] }
-
The index progress will be visible on the UI.
-
After the movement is complete, the new indexes will begin to service query scans.
-
The command line will display the new index nodes.
If the ALTER INDEX
fails, then:
-
The original indexes will continue to service query scans.
-
The UI Log and Query Workbench will have the appropriate error message.
-
Some common errors include:
Error Message Possible Cause GSI index xxxxxxxx not found
-
Mistyped an index name
Missing Node Information For Move Index
-
Mistyped
"node"
instead of"nodes"
-
Mistyped punctuation or other item
No Index Movement Required for Specified Destination List
-
Entered the current node instead of the target node
syntax error - at \",\"
-
Missed a double-quote mark (
"
)
Unable to find Index service for destination xxx.xxx.xxx.xxx:8091 or destination is not part of the cluster
-
Address doesn’t exist or was mistyped
-
Node isn’t running
-
Node not properly added to the cluster
Unsupported action value
-
Mistyped the
"action"
-
Examples
When using the below examples, make sure Couchbase Server 5.5 Enterprise Edition is already running on the named nodes.
Example 1: Move the def_faa index from one node to another.
Create a cluster of 3 nodes and then go to Settings > Sample buckets to install the travel-sample
bucket.
The indexes will then be installed in a round-robin fashion and distributed over the 3 nodes.
Then move the def_faa
index from the first node (192.168.10.10 in the screenshot) to the second node (192.168.10.11 in the screenshot).

ALTER INDEX `travel-sample`.def_faa WITH {"action":"move","nodes": ["192.168.10.11:8091"]}
You should see:
{ "results": [] }

Example 2: Create and move an index replica from one node to another.
Create an index on node 192.168.10.10 with a replica on node 192.168.10.11, then move its replica from node 192.168.10.11 to 192.168.10.12.
CREATE INDEX country_idx ON `travel-sample`(country, city) WHERE type="route" USING GSI WITH {"nodes":["192.168.10.10:8091", "192.168.10.11:8091"]}; ALTER INDEX `travel-sample`.country_idx WITH {"action":"move","nodes": ["192.168.10.10:8091", "172.23.120.12:8091"]}
Example 3: Moving multiple replicas.
Create an index on node 192.168.10.10 with replicas on nodes 192.168.10.11 and 192.168.10.12, then move the replicas to nodes 192.168.10.13 and 192.168.10.14.
CREATE INDEX country_idx ON `travel-sample`(country, city) WITH {"nodes": ["192.168.10.10:8091", "192.168.10.11:8091", "192.168.10.12:8091"]} ALTER INDEX `travel-sample`.country_idx WITH {"action":"move","nodes": ["192.168.10.10:8091", "192.168.10.13:8091", "192.168.10.14:8091"]}
Example 4: Removing an extra replica.
To avoid any downtime, before removing a replica (or index), first create an equivalent index for your queries to continue using. |
If you created an index on node 192.168.10.10 with replicas on nodes 192.168.10.11 and 192.168.10.12 and later decided you didn’t want the 2nd replica, then you’ll need to remove the index (which removes all replicas) and then re-create the index with only one replica.
CREATE INDEX country_idx ON `travel-sample`(country, city) WHERE type="route" USING GSI WITH {"nodes":["192.168.10.10:8091", "192.168.10.11:8091", "192.168.10.12:8091"]}; DROP INDEX `travel-sample`.country_idx; CREATE INDEX country_idx ON `travel-sample`(country, city) WHERE type="route" USING GSI WITH {"nodes":["192.168.10.10:8091", "192.168.10.11:8091"]};