Mike,

Let me try to clarify some things here. You currently have a ^Person global with data in it. What others are referring to are objects that would be similar to that global. The best way (IMO) to do this would be to convert the data into objects. First, create and compile a class:
Class User.TestPopulate Extends %Persistent
{
Property Name As %String;
Property Gender As %String;
Property Role As %String;

}

In my example, I populated a global:

%SYS>s ^Person(1) = "Pete|MALE|Senior Support Specialist"
%SYS>s ^Person(2) = "Mike|MALE|Developer"

The default global for data storage for your new class will just be <PACKAGE>.<CLASS>D and the index global will be I instead of D. So, for the data, you're looking at, in my case:

%SYS>zw ^User.TestPopulateD

--> This is empty, because I haven't populated the object at all. Now, I wrote a simple routine to iterate through the ^Person global (no matter how large it is, this will work). Note this has minimal error checking:

TestPopulate
= ""
{
= $o(^Person(x),1,y)
q:x=""
personOBJ = ##class(User.TestPopulate).%New()
personOBJ.Name = $p(y,"|",1)
personOBJ.Gender = $p(y,"|",2)
personOBJ.Role = $p(y,"|",3)
sc = personOBJ.%Save()
if (sc'=1) {
$system.OBJ.DisplayError(sc)
}
!,y
}

Note this also just prints out the value of each person as it goes. Now, I run that routine, and then take a look at the 'D' global again:

%SYS>d ^TestPopulate
 
Pete|MALE|Senior Support Specialist
Mike|MALE|Developer
%SYS>zw ^User.TestPopulateD
^User.TestPopulateD=2
^User.TestPopulateD(1)=$lb("","Pete","MALE","Senior Support Specialist")
^User.TestPopulateD(2)=$lb("","Mike","MALE","Developer")

Now, if I want to access  an individual record, I can via objects:

%SYS>s me = ##class(User.TestPopulate).%OpenId(1)
%SYS>w me.Name
Pete

Finally, if you want to access it with SQL, you can, now that it's populated in an object (note I had to use SQLUser instead of User because I chose 'User' as my package name):

%SYS>d $system.SQL.Shell()
SQL Command Line Shell
----------------------------------------------------
 
The command prefix is currently set to: <<nothing>>.
Enter q to quit, ? for help.
%SYS>>select * from SQLUser.TestPopulate
1.      select * from SQLUser.TestPopulate
 
ID      Gender  Name    Role
1       MALE    Pete    Senior Support Specialist
2       MALE    Mike    Developer
 
2 Rows(s) Affected
statement prepare time(s)/globals/lines/disk: 0.0819s/50437/298608/17ms
          execute time(s)/globals/lines/disk: 0.0005s/4/854/1ms
                          cached query class: %sqlcq.pSYS.cls6
---------------------------------------------------------------------------

Hope this helps

I have a few questions:

1) Why exactly do you need to call these via REST? What scenario do you have where running something like the example code in the documentation wouldn't work for you?

2) Assuming you do have a good reason to make these calls via REST, which part do you need help with? Creating the REST endpoint? Making the REST request?  Writing the code on the back end to run the appropriate commands?

I'll tackle question 2:

For deciding which backups to take in an ECP environment, it really depends on your setup. In a somewhat typical setup, you'd have the data on the database server, and code on the application servers. In that case, you would definitely want to back up the database server (since that's where the data is), but you may not need to back up the application servers if you have some other repository (such as source control) for your code base. 

I am not quite sure what you mean by having multiple data servers with the same instance name and database name. Can you elaborate? It is certainly possible to mirror your database server in an ECP environment.

Finally, I just want to note that you are talking about sharding, but tagged this as a Caché post. Only InterSystems IRIS supports sharding, not Caché. You probably want to tag this post with IRIS instead of Caché (or both, as your 2 questions really are quite separate).

There are a few good suggestions here, and I just want to add another one. You could write custom code as a wrapper to call API's for whatever you're changing (whether adding users, tasks, etc.). Then, on all mirror members, you could configure a REST service that would accept requests to do the same (aka call your wrappers based on the request payload). Then, when you call a wrapper to, for instance, add a user, your code would call the REST service on the other mirror members, which would trigger adding that user on those members, and call the Security.Users Create method to add the user on the local instance.

From what I've gathered from Oracle, CDC is just a way to replicate data onto another system. If that's what you're looking for, Caché mirroring is the answer you're looking for. Take a look at:

https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY...

That's the general mirroring information for how it works. Contained in that chapter is information about reporting asyncs, which is what it sounds like Oracle's CDC is for:

https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY...

Though, it looks like Oracle replicates data to a different database on the same system, which mirroring will not allow. If you want to do replication to a different database on the same instance (though I can't think of a use case for that), you could use shadowing instead:

https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY...

For what it's worth, the best way to find the details as to why you are getting this error in the future is to use the Audit Log. Here is the documentation on auditing. More details are in that doc, but the basic steps to look at this are:

1) Enable auditing

2) Go to Configure System Events and make sure the LoginFailure and Protect events are enabled

3) Reproduce the failed login

4) Look at the details of the audit log entry for the LoginFailure or Protect event that presumably occurred when you failed to log in

5) If you don't want auditing on or those events audited, reset the initial state of auditing by either turning off those events or auditing in general

You can assign a custom resource to the Message Viewer, per this documentation. See screenshot below (the assign button). You'd just need to make sure users that actually need to be able to use the message viewer have access to whatever custom resource you assign. There's also more information about the Ensemble Management Portal security in general in this documentation, which might help.

OK, that should be fine then. I thought maybe you were having an issue with an endian-ness change of the platform, but obviously that's not it. I'd again suggest opening a WRC issue. Try following Robert's suggestion, then collecting the cconsole.log and SYSLOG along with any error output you get from mounting. You could also post it here if you prefer.

Did the file come from the same Operating System? Do you get an error when you try to mount it, either when you try to mount it or in the cconsole.log? 

You may want to open a WRC issue to help with this. It would also help to have the Caché SYSLOG (do ^SYSLOG from the %SYS namespace), as errors that occur while mounting files are typically at the system level, which would get logged there.

Right, mirroring already takes care of the 'system availability', so this setting is forced to be turned on to also protect 'system integrity' (not to mention so mirroring can more easily detect failures).

I would say though that whether you need this turned on in a non-mirrored setup entirely depends on your application. You may have a major preference towards system availability over system integrity, though I'd say most setups that care enough about the data to journal it would likely want to have this Freeze on error turned on.