/// <summary> /// Creates availability group using Smo /// </summary> /// <param name="agName">Availability group name.</param> /// <param name="dbNames">Datbases to be part of the AG.</param> /// <param name="replicas">replicas to be part of the AG.</param> /// <param name="server">smo server.</param> public static AvailabilityGroup CreateAG(string agName, IEnumerable <string> dbNames, IEnumerable <Smo.Server> replicas, Smo.Server server) { if (!AGHelper.IsAGExist(agName, server)) { AvailabilityGroup ag = new AvailabilityGroup(server, agName); foreach (string dbName in dbNames) { ag.AvailabilityDatabases.Add(new AvailabilityDatabase(ag, dbName)); } foreach (Smo.Server replica in replicas) { AvailabilityReplica ar = new AvailabilityReplica(ag, replica.Name); ar.EndpointUrl = ARHelper.GetHadrEndpointUrl(replica); ar.AvailabilityMode = AvailabilityReplicaAvailabilityMode.AsynchronousCommit; ar.FailoverMode = AvailabilityReplicaFailoverMode.Manual; ag.AvailabilityReplicas.Add(ar); } ag.Create(); return(ag); } else { throw new Exception(string.Format("The requested availability Group {0} already exist in the given server {1}", agName, server.Name)); } }
/// <summary> /// Gets endpoint url for a given server. If endpoint doesn't exist, it will be created. /// </summary> /// <param name="server">SMO server for which endpoint url needs to be retrieved.</param> /// <returns>Endpoinurl in string format.</returns> public static string GetHadrEndpointUrl(SMO.Server server) { Endpoint ep = ARHelper.CreateHadrEndpoint(server); return(string.Format(@"TCP://{0}:{1}", System.Net.Dns.GetHostEntry(server.ComputerNamePhysicalNetBIOS).HostName.ToString(), ep.Protocol.Tcp.ListenerPort.ToString())); }
public static void ModifyFailoverModeOnPrimaryReplica(SMO.AvailabilityReplicaFailoverMode failoverMode, string availabilityGroupName, SMO.Server primaryReplicaServer) { SMO.AvailabilityReplica primaryReplica = ARHelper.GetPrimaryReplica(availabilityGroupName, primaryReplicaServer); primaryReplica.FailoverMode = failoverMode; primaryReplica.Alter(); }
public static void ModifyFailoverModeOnSecondaryReplicas(SMO.AvailabilityReplicaFailoverMode failoverMode, string availabilityGroupName, SMO.Server primaryReplicaServer) { foreach (SMO.AvailabilityReplica secondaryReplica in ARHelper.GetSecondaryReplicas(availabilityGroupName, primaryReplicaServer)) { secondaryReplica.FailoverMode = failoverMode; secondaryReplica.Alter(); } }
/// <summary> /// Deletes endpoint on port 5022 from a given server. Noop if endpoint doesn't exist. /// </summary> /// <param name="server">SMO server from which endpoint needs to be deleted.</param> public static void DeleteHadrEndpoint(SMO.Server server) { Endpoint ep = ARHelper.GetHadrEndpoint(server); if (null != ep) { ep.Drop(); } }
/// <summary> /// Configure an Availability group. This performs the following steps /// <list type="number"> /// <item>Join the secondary replica to the AG.</item> /// <item>Backup the databases from primary replica and restores it in secondary.</item> /// <item>Joins the database to primary.</item> /// </list> /// </summary> /// <param name="agName"></param> /// <param name="primaryReplica"></param> /// <param name="secondaryReplica"></param> /// <param name="databases"></param> /// <param name="fileShare"></param> public static void ConfigureAG(string agName, Smo.Server primaryReplica, Smo.Server secondaryReplica, IEnumerable <Database> databases, string fileShare) { ARHelper.JoinAG(agName, secondaryReplica); foreach (Database db in databases) { AGDBHelper.BackUpAndRestoreDatabase(fileShare, primaryReplica, secondaryReplica, db.Name); } foreach (Database db in databases) { AGDBHelper.JoinAG(db.Name, agName, secondaryReplica); } }
/// <summary> /// Creates endpoint on port 5022 on a given server. Skips creation if endpoint already exists. /// </summary> /// <param name="server">SMO server where endpoint needs to be created.</param> /// <returns>Newly created or existing endpoint.</returns> public static Endpoint CreateHadrEndpoint(SMO.Server server) { Endpoint ep = ARHelper.GetHadrEndpoint(server); if (null == ep) { ep = new Endpoint(server, hadrEndpointName); ep.EndpointType = EndpointType.DatabaseMirroring; ep.ProtocolType = ProtocolType.Tcp; ep.Payload.DatabaseMirroring.ServerMirroringRole = ServerMirroringRole.All; ep.Payload.DatabaseMirroring.EndpointEncryption = EndpointEncryption.Required; ep.Payload.DatabaseMirroring.EndpointEncryptionAlgorithm = EndpointEncryptionAlgorithm.Aes; ep.Create(); ep.Start(); if (ep.EndpointState != EndpointState.Started) { throw new Exception(string.Format("Endpoint {0} on server {1} failed to start", ep.Name, server.Name)); } } return(ep); }
// When we called this primary and secondary should being create public void TestCreateAGWithTwoReplicasWithoutDatabase() { Smo.Server primary = replicas[0]; AvailabilityGroup ag = new AvailabilityGroup(primary, agName); List <Smo.Server> secondaries = replicas.GetRange(1, replicas.Count - 1); for (int i = 0; i < replicas.Count; ++i) { AvailabilityReplica ar = ARHelper.BuildAR(ag, replicas[i].Name, replicaEndpointUrls[i]); ag.AvailabilityReplicas.Add(ar); } try { Console.WriteLine("Creating availability group '{0}' on server '{1}", ag.Name, primary.Name); ag.Create(); Thread.Sleep(1000); //Sleep a tick to let AG create take effect foreach (Smo.Server srv in secondaries) { srv.JoinAvailabilityGroup(agName); } CreateAGListener(); // enable autoseeding in secondary //secondary.GrantAvailabilityGroupCreateDatabasePrivilege(agName); } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine("Failed to create AG {0}", ag.Name); AGHelper.DropAG(ag.Name, primary); } }
public void Setup() { agName = "HadrBenchTest"; baseDBpath = @"\\zechen-d1\dbshare\"; dbshare = @"\\zechen-d1\dbshare\bench\"; //primaryServerName = @"ze-2016-v1\sql16rtm01"; //secondaryServerName = @"ze-2016-v2\sql16rtm01"; // start point of dbCount, lets say 500 primaryDbsNames = new List <string>(); primaryDbs = new List <Database>(); dbCacheLock = new ReaderWriterLockSlim(); dbCount = 0; // create three replicas replicas = new List <Server>(); secondaries = new List <Server>(); replicaEndpointUrls = new List <string>(); primaryServerName = string.Empty; Smo.Server srv; srv = new Smo.Server(@"ze-bench-01\hadrBenchMark01"); replicas.Add(srv); // primary is important primaryServerName = @"ze-bench-01\hadrBenchMark01"; primary = srv; //report server always point to 01 reportSrv = srv; reportServerName = primaryServerName; reportDBName = @"FailoverResult"; string username = "******"; string password = "******"; reportConnecionString = string.Format("server={0}; Initial Catalog={1};uid={2}; pwd={3} ", primaryServerName, reportDBName, username, password); srv = new Smo.Server(@"ze-bench-02\hadrBenchMark01"); replicas.Add(srv); secondaries.Add(srv); srv = new Smo.Server(@"ze-bench-03\hadrBenchMark01"); replicas.Add(srv); secondaries.Add(srv); string replicaEndpointUrl = string.Empty; foreach (Smo.Server server in replicas) { replicaEndpointUrl = ARHelper.GetHadrEndpointUrl(server); replicaEndpointUrls.Add(replicaEndpointUrl); } if (!AGHelper.IsAGExist(agName, primary)) { TestCreateAGWithTwoReplicasWithoutDatabase(); } this.notConnectedDBs = new List <string>(); stopBackup = false; }